- NtUserWaitForInputIdle: Call EngGetTickCount, removing duplicated code
[reactos.git] / reactos / dll / win32 / kernel32 / misc / time.c
index 90733f0..65ed5e9 100644 (file)
 #include <k32.h>
 
 #define NDEBUG
-#include "../include/debug.h"
+#include <debug.h>
 
 /* TYPES *********************************************************************/
 
 typedef struct __DOSTIME
 {
-  WORD Second:5;
-  WORD Minute:6;
-  WORD Hour:5;
+    WORD Second:5;
+    WORD Minute:6;
+    WORD Hour:5;
 } DOSTIME, *PDOSTIME;
 
 typedef struct __DOSDATE
 {
-  WORD Day:5;
-  WORD Month:4;
-  WORD Year:5;
+    WORD Day:5;
+    WORD Month:4;
+    WORD Year:5;
 } DOSDATE, *PDOSDATE;
 
-#define TICKSPERMIN        600000000
+#define TICKSPERMIN 600000000
+
+#define LL2FILETIME( ll, pft )\
+    (pft)->dwLowDateTime = (UINT)(ll); \
+    (pft)->dwHighDateTime = (UINT)((ll) >> 32);
+#define FILETIME2LL( pft, ll) \
+    ll = (((LONGLONG)((pft)->dwHighDateTime))<<32) + (pft)-> dwLowDateTime ;
+
+static const int MonthLengths[2][12] =
+{
+    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+/* STATIC FUNTIONS **********************************************************/
+
+static inline int IsLeapYear(int Year)
+{
+    return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0;
+}
+
+/***********************************************************************
+ *  TIME_DayLightCompareDate
+ *
+ * Compares two dates without looking at the year.
+ *
+ * PARAMS
+ *   date        [in] The local time to compare.
+ *   compareDate [in] The daylight savings begin or end date.
+ *
+ * RETURNS
+ *
+ *  -1 if date < compareDate
+ *   0 if date == compareDate
+ *   1 if date > compareDate
+ *  -2 if an error occurs
+ */
+static int
+TIME_DayLightCompareDate(const SYSTEMTIME *date, const SYSTEMTIME *compareDate)
+{
+    int limit_day, dayinsecs;
+
+    if (date->wMonth < compareDate->wMonth)
+        return -1; /* We are in a month before the date limit. */
+
+    if (date->wMonth > compareDate->wMonth)
+        return 1; /* We are in a month after the date limit. */
+
+    /* if year is 0 then date is in day-of-week format, otherwise
+     * it's absolute date.
+     */
+    if (compareDate->wYear == 0)
+    {
+        WORD First;
+        /* compareDate->wDay is interpreted as number of the week in the month
+         * 5 means: the last week in the month */
+        int weekofmonth = compareDate->wDay;
+          /* calculate the day of the first DayOfWeek in the month */
+        First = ( 6 + compareDate->wDayOfWeek - date->wDayOfWeek + date->wDay 
+               ) % 7 + 1;
+        limit_day = First + 7 * (weekofmonth - 1);
+        /* check needed for the 5th weekday of the month */
+        if(limit_day > MonthLengths[date->wMonth==2 && IsLeapYear(date->wYear)]
+                [date->wMonth - 1])
+            limit_day -= 7;
+    }
+    else
+    {
+       limit_day = compareDate->wDay;
+    }
+
+    /* convert to seconds */
+    limit_day = ((limit_day * 24  + compareDate->wHour) * 60 +
+            compareDate->wMinute ) * 60;
+    dayinsecs = ((date->wDay * 24  + date->wHour) * 60 +
+            date->wMinute ) * 60 + date->wSecond;
+    /* and compare */
+    return dayinsecs < limit_day ? -1 :
+           dayinsecs > limit_day ? 1 :
+           0;   /* date is equal to the date limit. */
+}
+
+/***********************************************************************
+ *  TIME_CompTimeZoneID
+ *
+ *  Computes the local time bias for a given time and time zone.
+ *
+ *  PARAMS
+ *      pTZinfo     [in] The time zone data.
+ *      lpFileTime  [in] The system or local time.
+ *      islocal     [in] it is local time.
+ *
+ *  RETURNS
+ *      TIME_ZONE_ID_INVALID    An error occurred
+ *      TIME_ZONE_ID_UNKNOWN    There are no transition time known
+ *      TIME_ZONE_ID_STANDARD   Current time is standard time
+ *      TIME_ZONE_ID_DAYLIGHT   Current time is daylight savings time
+ */
+static
+DWORD
+TIME_CompTimeZoneID( const TIME_ZONE_INFORMATION *pTZinfo, FILETIME *lpFileTime, BOOL islocal )
+{
+    int ret;
+    BOOL beforeStandardDate, afterDaylightDate;
+    DWORD retval = TIME_ZONE_ID_INVALID;
+    LONGLONG llTime = 0; /* initialized to prevent gcc complaining */
+    SYSTEMTIME SysTime;
+    FILETIME ftTemp;
+
+    if (pTZinfo->DaylightDate.wMonth != 0)
+    {
+        /* if year is 0 then date is in day-of-week format, otherwise
+         * it's absolute date.
+         */
+        if (pTZinfo->StandardDate.wMonth == 0 ||
+            (pTZinfo->StandardDate.wYear == 0 &&
+            (pTZinfo->StandardDate.wDay<1 ||
+            pTZinfo->StandardDate.wDay>5 ||
+            pTZinfo->DaylightDate.wDay<1 ||
+            pTZinfo->DaylightDate.wDay>5)))
+        {
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return TIME_ZONE_ID_INVALID;
+        }
+
+        if (!islocal) {
+            FILETIME2LL( lpFileTime, llTime );
+            llTime -= ( pTZinfo->Bias + pTZinfo->DaylightBias )
+                * (LONGLONG)TICKSPERMIN;
+            LL2FILETIME( llTime, &ftTemp)
+            lpFileTime = &ftTemp;
+        }
+
+        FileTimeToSystemTime(lpFileTime, &SysTime);
+        
+         /* check for daylight savings */
+        ret = TIME_DayLightCompareDate( &SysTime, &pTZinfo->StandardDate);
+        if (ret == -2)
+          return TIME_ZONE_ID_INVALID;
+
+        beforeStandardDate = ret < 0;
+
+        if (!islocal) {
+            llTime -= ( pTZinfo->StandardBias - pTZinfo->DaylightBias )
+                * (LONGLONG)TICKSPERMIN;
+            LL2FILETIME( llTime, &ftTemp)
+            FileTimeToSystemTime(lpFileTime, &SysTime);
+        }
+
+        ret = TIME_DayLightCompareDate( &SysTime, &pTZinfo->DaylightDate);
+        if (ret == -2)
+          return TIME_ZONE_ID_INVALID;
+
+        afterDaylightDate = ret >= 0;
+
+        retval = TIME_ZONE_ID_STANDARD;
+        if( pTZinfo->DaylightDate.wMonth <  pTZinfo->StandardDate.wMonth ) {
+            /* Northern hemisphere */
+            if( beforeStandardDate && afterDaylightDate )
+                retval = TIME_ZONE_ID_DAYLIGHT;
+        } else    /* Down south */
+            if( beforeStandardDate || afterDaylightDate )
+            retval = TIME_ZONE_ID_DAYLIGHT;
+    } else 
+        /* No transition date */
+        retval = TIME_ZONE_ID_UNKNOWN;
+        
+    return retval;
+}
+
+/***********************************************************************
+ *  TIME_GetTimezoneBias
+ *
+ *  Calculates the local time bias for a given time zone.
+ *
+ * PARAMS
+ *  pTZinfo    [in]  The time zone data.
+ *  lpFileTime [in]  The system or local time.
+ *  islocal    [in]  It is local time.
+ *  pBias      [out] The calculated bias in minutes.
+ *
+ * RETURNS
+ *  TRUE when the time zone bias was calculated.
+ */
+static BOOL
+TIME_GetTimezoneBias(const TIME_ZONE_INFORMATION *pTZinfo, FILETIME *lpFileTime, BOOL islocal, LONG *pBias)
+{
+    LONG bias = pTZinfo->Bias;
+    DWORD tzid = TIME_CompTimeZoneID(pTZinfo, lpFileTime, islocal);
+
+    if( tzid == TIME_ZONE_ID_INVALID)
+        return FALSE;
+    if (tzid == TIME_ZONE_ID_DAYLIGHT)
+        bias += pTZinfo->DaylightBias;
+    else if (tzid == TIME_ZONE_ID_STANDARD)
+        bias += pTZinfo->StandardBias;
+    *pBias = bias;
+    return TRUE;
+}
+
 
 /* FUNCTIONS ****************************************************************/
 
@@ -41,40 +240,35 @@ typedef struct __DOSDATE
  * @implemented
  */
 BOOL
-STDCALL
-FileTimeToDosDateTime(
-                     CONST FILETIME *lpFileTime,
-                     LPWORD lpFatDate,
-                     LPWORD lpFatTime
-                     )
+WINAPI
+FileTimeToDosDateTime(CONST FILETIME *lpFileTime,
+                      LPWORD lpFatDate,
+                      LPWORD lpFatTime)
 {
-   PDOSTIME  pdtime=(PDOSTIME) lpFatTime;
-   PDOSDATE  pddate=(PDOSDATE) lpFatDate;
-   SYSTEMTIME SystemTime = { 0 };
+    PDOSTIME  pdtime=(PDOSTIME) lpFatTime;
+    PDOSDATE  pddate=(PDOSDATE) lpFatDate;
+    SYSTEMTIME SystemTime = { 0, 0, 0, 0, 0, 0, 0, 0 };
 
-   if ( lpFileTime == NULL )
-               return FALSE;
+    if (lpFileTime == NULL)
+        return FALSE;
 
-   if ( lpFatDate == NULL )
-           return FALSE;
+    if (lpFatDate == NULL)
+        return FALSE;
 
-   if ( lpFatTime == NULL )
-           return FALSE;
+    if (lpFatTime == NULL)
+        return FALSE;
 
-   FileTimeToSystemTime(
-                    lpFileTime,
-                    &SystemTime
-                    );
+    FileTimeToSystemTime(lpFileTime, &SystemTime);
 
-   pdtime->Second = SystemTime.wSecond / 2;
-   pdtime->Minute = SystemTime.wMinute;
-   pdtime->Hour = SystemTime.wHour;
+    pdtime->Second = SystemTime.wSecond / 2;
+    pdtime->Minute = SystemTime.wMinute;
+    pdtime->Hour = SystemTime.wHour;
 
-   pddate->Day = SystemTime.wDay;
-   pddate->Month = SystemTime.wMonth;
-   pddate->Year = SystemTime.wYear - 1980;
+    pddate->Day = SystemTime.wDay;
+    pddate->Month = SystemTime.wMonth;
+    pddate->Year = SystemTime.wYear - 1980;
 
-   return TRUE;
+    return TRUE;
 }
 
 
@@ -82,32 +276,30 @@ FileTimeToDosDateTime(
  * @implemented
  */
 BOOL
-STDCALL
-DosDateTimeToFileTime(
-                     WORD wFatDate,
-                     WORD wFatTime,
-                     LPFILETIME lpFileTime
-                     )
+WINAPI
+DosDateTimeToFileTime(WORD wFatDate,
+                      WORD wFatTime,
+                      LPFILETIME lpFileTime)
 {
-   PDOSTIME  pdtime = (PDOSTIME) &wFatTime;
-   PDOSDATE  pddate = (PDOSDATE) &wFatDate;
-   SYSTEMTIME SystemTime;
+    PDOSTIME  pdtime = (PDOSTIME) &wFatTime;
+    PDOSDATE  pddate = (PDOSDATE) &wFatDate;
+    SYSTEMTIME SystemTime;
 
-   if ( lpFileTime == NULL )
-               return FALSE;
+    if (lpFileTime == NULL)
+        return FALSE;
 
-   SystemTime.wMilliseconds = 0;
-   SystemTime.wSecond = pdtime->Second * 2;
-   SystemTime.wMinute = pdtime->Minute;
-   SystemTime.wHour = pdtime->Hour;
+    SystemTime.wMilliseconds = 0;
+    SystemTime.wSecond = pdtime->Second * 2;
+    SystemTime.wMinute = pdtime->Minute;
+    SystemTime.wHour = pdtime->Hour;
 
-   SystemTime.wDay = pddate->Day;
-   SystemTime.wMonth = pddate->Month;
-   SystemTime.wYear = 1980 + pddate->Year;
+    SystemTime.wDay = pddate->Day;
+    SystemTime.wMonth = pddate->Month;
+    SystemTime.wYear = 1980 + pddate->Year;
 
-   SystemTimeToFileTime(&SystemTime,lpFileTime);
+    SystemTimeToFileTime(&SystemTime,lpFileTime);
 
-   return TRUE;
+    return TRUE;
 }
 
 
@@ -115,38 +307,36 @@ DosDateTimeToFileTime(
  * @implemented
  */
 LONG
-STDCALL
-CompareFileTime(
-               CONST FILETIME *lpFileTime1,
-               CONST FILETIME *lpFileTime2
-               )
+WINAPI
+CompareFileTime(CONST FILETIME *lpFileTime1, CONST FILETIME *lpFileTime2)
 {
-  if ( lpFileTime1 == NULL )
-       return 0;
-  if ( lpFileTime2 == NULL )
-       return 0;
+    if (lpFileTime1 == NULL)
+        return 0;
+    if (lpFileTime2 == NULL)
+        return 0;
 
-  if (*((PLONGLONG)lpFileTime1) > *((PLONGLONG)lpFileTime2))
-       return 1;
-  else if (*((PLONGLONG)lpFileTime1) < *((PLONGLONG)lpFileTime2))
-       return -1;
+    if (*((PLONGLONG)lpFileTime1) > *((PLONGLONG)lpFileTime2))
+        return 1;
+    else if (*((PLONGLONG)lpFileTime1) < *((PLONGLONG)lpFileTime2))
+        return -1;
 
-  return 0;
+    return 0;
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
-GetSystemTimeAsFileTime (PFILETIME lpFileTime)
+VOID
+WINAPI
+GetSystemTimeAsFileTime(PFILETIME lpFileTime)
 {
-  do
+    do
     {
-      lpFileTime->dwHighDateTime = SharedUserData->SystemTime.High1Time;
-      lpFileTime->dwLowDateTime = SharedUserData->SystemTime.LowPart;
+        lpFileTime->dwHighDateTime = SharedUserData->SystemTime.High1Time;
+        lpFileTime->dwLowDateTime = SharedUserData->SystemTime.LowPart;
     }
-  while (lpFileTime->dwHighDateTime != (DWORD)SharedUserData->SystemTime.High2Time);
+    while (lpFileTime->dwHighDateTime != (DWORD)SharedUserData->SystemTime.High2Time);
 }
 
 
@@ -154,31 +344,29 @@ GetSystemTimeAsFileTime (PFILETIME lpFileTime)
  * @implemented
  */
 BOOL
-STDCALL
-SystemTimeToFileTime(
-    CONST SYSTEMTIME *  lpSystemTime,
-    LPFILETIME  lpFileTime
-   )
-
+WINAPI
+SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime)
 {
-  TIME_FIELDS TimeFields;
-  LARGE_INTEGER liTime;
-
-  TimeFields.Year = lpSystemTime->wYear;
-  TimeFields.Month = lpSystemTime->wMonth;
-  TimeFields.Day = lpSystemTime->wDay;
-  TimeFields.Hour = lpSystemTime->wHour;
-  TimeFields.Minute = lpSystemTime->wMinute;
-  TimeFields.Second = lpSystemTime->wSecond;
-  TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
-
-  if (RtlTimeFieldsToTime (&TimeFields, &liTime))
-  {
-     lpFileTime->dwLowDateTime = liTime.u.LowPart;
-     lpFileTime->dwHighDateTime = liTime.u.HighPart;
-     return TRUE;
-  }
-  return FALSE;
+    TIME_FIELDS TimeFields;
+    LARGE_INTEGER liTime;
+
+    TimeFields.Year = lpSystemTime->wYear;
+    TimeFields.Month = lpSystemTime->wMonth;
+    TimeFields.Day = lpSystemTime->wDay;
+    TimeFields.Hour = lpSystemTime->wHour;
+    TimeFields.Minute = lpSystemTime->wMinute;
+    TimeFields.Second = lpSystemTime->wSecond;
+    TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
+
+    if (RtlTimeFieldsToTime (&TimeFields, &liTime))
+    {
+        lpFileTime->dwLowDateTime = liTime.u.LowPart;
+        lpFileTime->dwHighDateTime = liTime.u.HighPart;
+        return TRUE;
+    }
+
+    SetLastError(ERROR_INVALID_PARAMETER);
+    return FALSE;
 }
 
 
@@ -186,33 +374,30 @@ SystemTimeToFileTime(
  * @implemented
  */
 BOOL
-STDCALL
-FileTimeToSystemTime(
-                    CONST FILETIME *lpFileTime,
-                    LPSYSTEMTIME lpSystemTime
-                    )
+WINAPI
+FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime)
 {
-  TIME_FIELDS TimeFields;
-  LARGE_INTEGER liTime;
+    TIME_FIELDS TimeFields;
+    LARGE_INTEGER liTime;
 
-  if(lpFileTime->dwHighDateTime & 0x80000000)
-   return FALSE;
+    if (lpFileTime->dwHighDateTime & 0x80000000)
+        return FALSE;
 
-  liTime.u.LowPart = lpFileTime->dwLowDateTime;
-  liTime.u.HighPart = lpFileTime->dwHighDateTime;
+    liTime.u.LowPart = lpFileTime->dwLowDateTime;
+    liTime.u.HighPart = lpFileTime->dwHighDateTime;
 
-  RtlTimeToTimeFields(&liTime, &TimeFields);
+    RtlTimeToTimeFields(&liTime, &TimeFields);
 
-  lpSystemTime->wYear = TimeFields.Year;
-  lpSystemTime->wMonth = TimeFields.Month;
-  lpSystemTime->wDay = TimeFields.Day;
-  lpSystemTime->wHour = TimeFields.Hour;
-  lpSystemTime->wMinute = TimeFields.Minute;
-  lpSystemTime->wSecond = TimeFields.Second;
-  lpSystemTime->wMilliseconds = TimeFields.Milliseconds;
-  lpSystemTime->wDayOfWeek = TimeFields.Weekday;
+    lpSystemTime->wYear = TimeFields.Year;
+    lpSystemTime->wMonth = TimeFields.Month;
+    lpSystemTime->wDay = TimeFields.Day;
+    lpSystemTime->wHour = TimeFields.Hour;
+    lpSystemTime->wMinute = TimeFields.Minute;
+    lpSystemTime->wSecond = TimeFields.Second;
+    lpSystemTime->wMilliseconds = TimeFields.Milliseconds;
+    lpSystemTime->wDayOfWeek = TimeFields.Weekday;
 
-  return TRUE;
+    return TRUE;
 }
 
 
@@ -220,25 +405,21 @@ FileTimeToSystemTime(
  * @implemented
  */
 BOOL
-STDCALL
-FileTimeToLocalFileTime(
-                       CONST FILETIME *lpFileTime,
-                       LPFILETIME lpLocalFileTime
-                       )
+WINAPI
+FileTimeToLocalFileTime(CONST FILETIME *lpFileTime, LPFILETIME lpLocalFileTime)
 {
-  LARGE_INTEGER TimeZoneBias;
+    LARGE_INTEGER TimeZoneBias;
 
-  do
+    do
     {
-      TimeZoneBias.HighPart = SharedUserData->TimeZoneBias.High1Time;
-      TimeZoneBias.LowPart = SharedUserData->TimeZoneBias.LowPart;
+        TimeZoneBias.HighPart = SharedUserData->TimeZoneBias.High1Time;
+        TimeZoneBias.LowPart = SharedUserData->TimeZoneBias.LowPart;
     }
-  while (TimeZoneBias.HighPart != SharedUserData->TimeZoneBias.High2Time);
+    while (TimeZoneBias.HighPart != SharedUserData->TimeZoneBias.High2Time);
 
-  *((PLONGLONG)lpLocalFileTime) =
-    *((PLONGLONG)lpFileTime) - TimeZoneBias.QuadPart;
+    *((PLONGLONG)lpLocalFileTime) = *((PLONGLONG)lpFileTime) - TimeZoneBias.QuadPart;
 
-  return TRUE;
+    return TRUE;
 }
 
 
@@ -246,256 +427,325 @@ FileTimeToLocalFileTime(
  * @implemented
  */
 BOOL
-STDCALL
-LocalFileTimeToFileTime(
-                       CONST FILETIME *lpLocalFileTime,
-                       LPFILETIME lpFileTime
-                       )
+WINAPI
+LocalFileTimeToFileTime(CONST FILETIME *lpLocalFileTime, LPFILETIME lpFileTime)
 {
-  LARGE_INTEGER TimeZoneBias;
+    LARGE_INTEGER TimeZoneBias;
 
-  do
+    do
     {
-      TimeZoneBias.HighPart = SharedUserData->TimeZoneBias.High1Time;
-      TimeZoneBias.LowPart = SharedUserData->TimeZoneBias.LowPart;
+        TimeZoneBias.HighPart = SharedUserData->TimeZoneBias.High1Time;
+        TimeZoneBias.LowPart = SharedUserData->TimeZoneBias.LowPart;
     }
-  while (TimeZoneBias.HighPart != SharedUserData->TimeZoneBias.High2Time);
+    while (TimeZoneBias.HighPart != SharedUserData->TimeZoneBias.High2Time);
 
-  *((PLONGLONG)lpFileTime) =
-    *((PLONGLONG)lpLocalFileTime) + TimeZoneBias.QuadPart;
+    *((PLONGLONG)lpFileTime) = *((PLONGLONG)lpLocalFileTime) + TimeZoneBias.QuadPart;
 
-  return TRUE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID
+WINAPI
 GetLocalTime(LPSYSTEMTIME lpSystemTime)
 {
-  FILETIME FileTime;
-  FILETIME LocalFileTime;
+    FILETIME FileTime;
+    FILETIME LocalFileTime;
 
-  GetSystemTimeAsFileTime(&FileTime);
-  FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
-  FileTimeToSystemTime(&LocalFileTime, lpSystemTime);
+    GetSystemTimeAsFileTime(&FileTime);
+    FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
+    FileTimeToSystemTime(&LocalFileTime, lpSystemTime);
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID
+WINAPI
 GetSystemTime(LPSYSTEMTIME lpSystemTime)
 {
-  FILETIME FileTime;
+    FILETIME FileTime;
 
-  GetSystemTimeAsFileTime(&FileTime);
-  FileTimeToSystemTime(&FileTime, lpSystemTime);
+    GetSystemTimeAsFileTime(&FileTime);
+    FileTimeToSystemTime(&FileTime, lpSystemTime);
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 SetLocalTime(CONST SYSTEMTIME *lpSystemTime)
 {
-  FILETIME LocalFileTime;
-  LARGE_INTEGER FileTime;
-  NTSTATUS Status;
-
-  SystemTimeToFileTime(lpSystemTime, &LocalFileTime);
-  LocalFileTimeToFileTime(&LocalFileTime, (FILETIME *)&FileTime);
-  Status = NtSetSystemTime(&FileTime, &FileTime);
-  if (!NT_SUCCESS(Status))
-    return FALSE;
-  return TRUE;
+    FILETIME LocalFileTime;
+    LARGE_INTEGER FileTime;
+    NTSTATUS Status;
+
+    SystemTimeToFileTime(lpSystemTime, &LocalFileTime);
+    LocalFileTimeToFileTime(&LocalFileTime, (FILETIME *)&FileTime);
+    Status = NtSetSystemTime(&FileTime, &FileTime);
+    if (!NT_SUCCESS(Status))
+        return FALSE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 SetSystemTime(CONST SYSTEMTIME *lpSystemTime)
 {
-  LARGE_INTEGER NewSystemTime;
-  NTSTATUS Status;
+    LARGE_INTEGER NewSystemTime;
+    NTSTATUS Status;
 
-  SystemTimeToFileTime(lpSystemTime, (PFILETIME)&NewSystemTime);
-  Status = NtSetSystemTime(&NewSystemTime, &NewSystemTime);
-  if (!NT_SUCCESS(Status))
-    return FALSE;
-  return TRUE;
+    SystemTimeToFileTime(lpSystemTime, (PFILETIME)&NewSystemTime);
+    Status = NtSetSystemTime(&NewSystemTime, &NewSystemTime);
+    if (!NT_SUCCESS(Status))
+        return FALSE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-DWORD STDCALL
+DWORD
+WINAPI
 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
 {
-   NTSTATUS Status;
+    NTSTATUS Status;
 
-   DPRINT("GetTimeZoneInformation()\n");
+    DPRINT("GetTimeZoneInformation()\n");
 
-   Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation,
-                                    lpTimeZoneInformation,
-                                    sizeof(TIME_ZONE_INFORMATION),
-                                    NULL);
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return TIME_ZONE_ID_INVALID;
-     }
+    Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation,
+                                      lpTimeZoneInformation,
+                                      sizeof(TIME_ZONE_INFORMATION),
+                                      NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+        return TIME_ZONE_ID_INVALID;
+    }
 
-   return(SharedUserData->TimeZoneId);
+    return(SharedUserData->TimeZoneId);
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation)
 {
-   NTSTATUS Status;
-
-   DPRINT("SetTimeZoneInformation()\n");
-
-   Status = RtlSetTimeZoneInformation((LPTIME_ZONE_INFORMATION)lpTimeZoneInformation);
-   if (!NT_SUCCESS(Status))
-     {
-       DPRINT1("RtlSetTimeZoneInformation() failed (Status %lx)\n", Status);
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   Status = NtSetSystemInformation(SystemCurrentTimeZoneInformation,
-                                  (PVOID)lpTimeZoneInformation,
-                                  sizeof(TIME_ZONE_INFORMATION));
-   if (!NT_SUCCESS(Status))
-     {
-       DPRINT1("NtSetSystemInformation() failed (Status %lx)\n", Status);
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   return TRUE;
+    NTSTATUS Status;
+
+    DPRINT("SetTimeZoneInformation()\n");
+
+    Status = RtlSetTimeZoneInformation((LPTIME_ZONE_INFORMATION)lpTimeZoneInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("RtlSetTimeZoneInformation() failed (Status %lx)\n", Status);
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
+
+    Status = NtSetSystemInformation(SystemCurrentTimeZoneInformation,
+                                    (PVOID)lpTimeZoneInformation,
+                                    sizeof(TIME_ZONE_INFORMATION));
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtSetSystemInformation() failed (Status %lx)\n", Status);
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-DWORD STDCALL
+DWORD
+WINAPI
 GetTickCount(VOID)
 {
-  return (DWORD)((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216);
+    /* Call the 64-bit version */
+    return (DWORD)GetTickCount64();
 }
 
 
 /*
  * @implemented
  */
-ULONGLONG WINAPI
+ULONGLONG
+WINAPI
 GetTickCount64(VOID)
 {
-    return (ULONGLONG)SharedUserData->TickCountLowDeprecated * (ULONGLONG)SharedUserData->TickCountMultiplier / 16777216;
+    ULONG Multiplier;
+    LARGE_INTEGER TickCount;
+
+    /* Loop until we get a perfect match */
+    for (;;)
+    {
+        /* Read the tick count value */
+        TickCount.HighPart = SharedUserData->TickCount.High1Time;
+        TickCount.LowPart = SharedUserData->TickCount.LowPart;
+        if (TickCount.HighPart == SharedUserData->TickCount.High2Time) break;
+        YieldProcessor();
+    }
+
+    /* Get the multiplier */
+    Multiplier = SharedUserData->TickCountMultiplier;
+
+    /* Convert to milliseconds and return */
+    return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) +
+            (Multiplier * (TickCount.HighPart << 8)));
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-SystemTimeToTzSpecificLocalTime(
-                                CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation,
+BOOL
+WINAPI
+SystemTimeToTzSpecificLocalTime(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation,
                                 CONST SYSTEMTIME *lpUniversalTime,
-                                LPSYSTEMTIME lpLocalTime
-                               )
+                                LPSYSTEMTIME lpLocalTime)
 {
-  TIME_ZONE_INFORMATION TimeZoneInformation;
-  LPTIME_ZONE_INFORMATION lpTzInfo;
-  LARGE_INTEGER FileTime;
-
-  if (!lpTimeZoneInformation)
-  {
-    GetTimeZoneInformation(&TimeZoneInformation);
-    lpTzInfo = &TimeZoneInformation;
-  }
-  else
-    lpTzInfo = (LPTIME_ZONE_INFORMATION)lpTimeZoneInformation;
-
-  if (!lpUniversalTime)
-    return FALSE;
+    TIME_ZONE_INFORMATION TzInfo;
+    FILETIME FileTime;
+    LONGLONG llTime;
+    LONG lBias;
 
-  if (!lpLocalTime)
-    return FALSE;
+    if (lpTimeZoneInformation != NULL)
+    {
+        TzInfo = *lpTimeZoneInformation;
+    }
+    else
+    {
+        if (GetTimeZoneInformation(&TzInfo) == TIME_ZONE_ID_INVALID)
+            return FALSE;
+    }
+
+    if (!lpUniversalTime || !lpLocalTime)
+        return FALSE;
+
+    if (!SystemTimeToFileTime(lpUniversalTime, &FileTime))
+        return FALSE;
+
+    FILETIME2LL(&FileTime, llTime)
+
+    if (!TIME_GetTimezoneBias(&TzInfo, &FileTime, FALSE, &lBias))
+        return FALSE;
+
+    /* convert minutes to 100-nanoseconds-ticks */
+    llTime -= (LONGLONG)lBias * TICKSPERMIN;
+
+    LL2FILETIME( llTime, &FileTime)
 
-  SystemTimeToFileTime(lpUniversalTime, (PFILETIME)&FileTime);
-  FileTime.QuadPart -= (lpTzInfo->Bias * TICKSPERMIN);
-  FileTimeToSystemTime((PFILETIME)&FileTime, lpLocalTime);
+    return FileTimeToSystemTime(&FileTime, lpLocalTime);
+}
+
+
+/*
+ * @implemented (Wine 13 sep 2008)
+ */
+BOOL
+WINAPI
+TzSpecificLocalTimeToSystemTime(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation,
+                                CONST SYSTEMTIME *lpLocalTime,
+                                LPSYSTEMTIME lpUniversalTime)
+{
+    FILETIME ft;
+    LONG lBias;
+    LONGLONG t;
+    TIME_ZONE_INFORMATION tzinfo;
+
+    if (lpTimeZoneInformation != NULL)
+    {
+        tzinfo = *lpTimeZoneInformation;
+    }
+    else
+    {
+        if (GetTimeZoneInformation(&tzinfo) == TIME_ZONE_ID_INVALID)
+            return FALSE;
+    }
 
-  return TRUE;
+    if (!SystemTimeToFileTime(lpLocalTime, &ft))
+        return FALSE;
+    FILETIME2LL( &ft, t)
+    if (!TIME_GetTimezoneBias(&tzinfo, &ft, TRUE, &lBias))
+        return FALSE;
+    /* convert minutes to 100-nanoseconds-ticks */
+    t += (LONGLONG)lBias * TICKSPERMIN;
+    LL2FILETIME( t, &ft)
+    return FileTimeToSystemTime(&ft, lpUniversalTime);
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,
-                       PDWORD lpTimeIncrement,
-                       PBOOL lpTimeAdjustmentDisabled)
+                        PDWORD lpTimeIncrement,
+                        PBOOL lpTimeAdjustmentDisabled)
 {
-   SYSTEM_QUERY_TIME_ADJUST_INFORMATION Buffer;
-   NTSTATUS Status;
-
-   Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
-                                    &Buffer,
-                                    sizeof(SYSTEM_QUERY_TIME_ADJUST_INFORMATION),
-                                    NULL);
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   *lpTimeAdjustment = (DWORD)Buffer.TimeAdjustment;
-   *lpTimeIncrement = (DWORD)Buffer.TimeIncrement;
-   *lpTimeAdjustmentDisabled = (BOOL)Buffer.Enable;
-
-   return TRUE;
+    SYSTEM_QUERY_TIME_ADJUST_INFORMATION Buffer;
+    NTSTATUS Status;
+
+    Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
+                                      &Buffer,
+                                      sizeof(SYSTEM_QUERY_TIME_ADJUST_INFORMATION),
+                                      NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
+
+    *lpTimeAdjustment = (DWORD)Buffer.TimeAdjustment;
+    *lpTimeIncrement = (DWORD)Buffer.TimeIncrement;
+    *lpTimeAdjustmentDisabled = (BOOL)Buffer.Enable;
+
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 SetSystemTimeAdjustment(DWORD dwTimeAdjustment,
-                       BOOL bTimeAdjustmentDisabled)
+                        BOOL bTimeAdjustmentDisabled)
 {
-   NTSTATUS Status;
-   SYSTEM_SET_TIME_ADJUST_INFORMATION Buffer;
-
-   Buffer.TimeAdjustment = (ULONG)dwTimeAdjustment;
-   Buffer.Enable = (BOOLEAN)bTimeAdjustmentDisabled;
-
-   Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
-                                  &Buffer,
-                                  sizeof(SYSTEM_SET_TIME_ADJUST_INFORMATION));
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   return TRUE;
+    NTSTATUS Status;
+    SYSTEM_SET_TIME_ADJUST_INFORMATION Buffer;
+
+    Buffer.TimeAdjustment = (ULONG)dwTimeAdjustment;
+    Buffer.Enable = (BOOLEAN)bTimeAdjustmentDisabled;
+
+    Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
+                                    &Buffer,
+                                    sizeof(SYSTEM_SET_TIME_ADJUST_INFORMATION));
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 
@@ -503,40 +753,38 @@ SetSystemTimeAdjustment(DWORD dwTimeAdjustment,
  * @implemented
  */
 BOOL
-STDCALL
-GetSystemTimes(
-    LPFILETIME lpIdleTime,
-    LPFILETIME lpKernelTime,
-    LPFILETIME lpUserTime
-    )
+WINAPI
+GetSystemTimes(LPFILETIME lpIdleTime,
+               LPFILETIME lpKernelTime,
+               LPFILETIME lpUserTime)
 {
-   SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcPerfInfo;
-   NTSTATUS Status;
+    SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcPerfInfo;
+    NTSTATUS Status;
 
-   Status = ZwQuerySystemInformation(SystemProcessorPerformanceInformation,
-                                     &SysProcPerfInfo,
-                                     sizeof(SysProcPerfInfo),
-                                     NULL);
+    Status = ZwQuerySystemInformation(SystemProcessorPerformanceInformation,
+                                      &SysProcPerfInfo,
+                                      sizeof(SysProcPerfInfo),
+                                      NULL);
 
-   if (!NT_SUCCESS(Status))
-     {
+    if (!NT_SUCCESS(Status))
+    {
         SetLastErrorByStatus(Status);
         return FALSE;
-     }
+    }
 /*
-       Good only for one processor system.
+    Good only for one processor system.
  */
 
-   lpIdleTime->dwLowDateTime = SysProcPerfInfo.IdleTime.LowPart;
-   lpIdleTime->dwHighDateTime = SysProcPerfInfo.IdleTime.HighPart;
+    lpIdleTime->dwLowDateTime = SysProcPerfInfo.IdleTime.LowPart;
+    lpIdleTime->dwHighDateTime = SysProcPerfInfo.IdleTime.HighPart;
 
-   lpKernelTime->dwLowDateTime = SysProcPerfInfo.KernelTime.LowPart;
-   lpKernelTime->dwHighDateTime = SysProcPerfInfo.KernelTime.HighPart;
+    lpKernelTime->dwLowDateTime = SysProcPerfInfo.KernelTime.LowPart;
+    lpKernelTime->dwHighDateTime = SysProcPerfInfo.KernelTime.HighPart;
 
-   lpUserTime->dwLowDateTime = SysProcPerfInfo.UserTime.LowPart;
-   lpUserTime->dwHighDateTime = SysProcPerfInfo.UserTime.HighPart;
+    lpUserTime->dwLowDateTime = SysProcPerfInfo.UserTime.LowPart;
+    lpUserTime->dwHighDateTime = SysProcPerfInfo.UserTime.HighPart;
 
-   return TRUE;
+    return TRUE;
 }
 
 /* EOF */