Move some time fucntions to ntdll

György 'Nog' Jeney nog at sdf.lonestar.org
Thu Nov 21 04:59:58 CST 2002


ChangeLog:
 * dlls/kernel/time.c
 * dlls/ntdll/ntdll.spec
 * dlls/ntdll/time.c
   - Move SetSystemTime to NtSetSystemTime
   - Move GetTimeZoneInformation to RtlQueryTimeZoneInformation.
   - Move SetTimeZoneInformation to RtlSetTimeZoneInformation.
   - Docu updates.

nog.

-------------- next part --------------
Index: dlls/kernel/time.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/time.c,v
retrieving revision 1.24
diff -u -r1.24 time.c
--- dlls/kernel/time.c	12 Sep 2002 22:07:03 -0000	1.24
+++ dlls/kernel/time.c	21 Nov 2002 17:29:48 -0000
@@ -45,250 +45,6 @@
 #define CALINFO_MAX_YEAR 2029
 
 
-/* This structure is used to store strings that represent all of the time zones
-   in the world. (This is used to help GetTimeZoneInformation)
-*/
-struct tagTZ_INFO
-{
-    const char *psTZFromUnix;
-    WCHAR psTZWindows[32];
-    int bias;
-    int dst;
-};
-
-static const struct tagTZ_INFO TZ_INFO[] =
-{
-   {"MHT",
-    {'D','a','t','e','l','i','n','e',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -720, 0},
-   {"SST",
-    {'S','a','m','o','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    660, 0},
-   {"HST",
-    {'H','a','w','a','i','i','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    600, 0},
-   {"AKDT",
-    {'A','l','a','s','k','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    480, 1},
-   {"PDT",
-    {'P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    420, 1},
-   {"MST",
-    {'U','S',' ','M','o','u','n','t','a','i','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    420, 0},
-   {"MDT",
-    {'M','o','u','n','t','a','i','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    360, 1},
-   {"CST",
-    {'C','e','n','t','r','a','l',' ','A','m','e','r','i','c','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    360, 0},
-   {"CDT",
-    {'C','e','n','t','r','a','l',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    300, 1},
-   {"COT",
-    {'S','A',' ','P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    300, 0},
-   {"EDT",
-    {'E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-     240, 1},
-   {"EST",
-    {'U','S',' ','E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    300, 0},
-   {"ADT",
-    {'A','t','l','a','n','t','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    180, 1},
-   {"VET",
-    {'S','A',' ','W','e','s','t','e','r','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-     240, 0},
-   {"CLT",
-    {'P','a','c','i','f','i','c',' ','S','A',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-     240, 0},
-   {"NDT",
-    {'N','e','w','f','o','u','n','d','l','a','n','d',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    150, 1},
-   {"BRT",
-    {'E','.',' ','S','o','u','t','h',' ','A','m','e','r','i','c','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    180, 0},
-   {"ART",
-    {'S','A',' ','E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    180, 0},
-   {"WGST",
-    {'G','r','e','e','n','l','a','n','d',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    120, 1},
-   {"GST",
-    {'M','i','d','-','A','t','l','a','n','t','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    120, 0},
-   {"AZOST",
-    {'A','z','o','r','e','s',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    0, 1},
-   {"CVT",
-    {'C','a','p','e',' ','V','e','r','d','e',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    60, 0},
-   {"WET",
-    {'G','r','e','e','n','w','i','c','h',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    0, 0},
-   {"BST",
-    {'G','M','T',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -60, 1},
-   {"GMT",
-    {'G','M','T',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    0, 0},
-   {"CEST",
-    {'C','e','n','t','r','a','l',' ','E','u','r','o','p','e',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -120, 1},
-   {"WAT",
-    {'W','.',' ','C','e','n','t','r','a','l',' ','A','f','r','i','c','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -60, 0},
-   {"EEST",
-    {'E','.',' ','E','u','r','o','p','e',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -180, 1},
-   {"EET",
-    {'E','g','y','p','t',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -120, 0},
-   {"CAT",
-    {'S','o','u','t','h',' ','A','f','r','i','c','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -120, 0},
-   {"IST",
-    {'I','s','r','a','e','l',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -120, 0},
-   {"ADT",
-    {'A','r','a','b','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -240, 1},
-   {"AST",
-    {'A','r','a','b',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -180, 0},
-   {"MSD",
-    {'R','u','s','s','i','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -240, 1},
-   {"EAT",
-    {'E','.',' ','A','f','r','i','c','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -180, 0},
-   {"IRST",
-    {'I','r','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -270, 1},
-   {"GST",
-    {'A','r','a','b','i','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -240, 0},
-   {"AZST",
-    {'C','a','u','c','a','s','u','s',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -300, 1},
-   {"AFT",
-    {'A','f','g','h','a','n','i','s','t','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -270, 0},
-   {"YEKST",
-    {'E','k','a','t','e','r','i','n','b','u','r','g',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -360, 1},
-   {"PKT",
-    {'W','e','s','t',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -300, 0},
-   {"IST",
-    {'I','n','d','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -330, 0},
-   {"NPT",
-    {'N','e','p','a','l',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -345, 0},
-   {"ALMST",
-    {'N','.',' ','C','e','n','t','r','a','l',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -420, 1},
-   {"BDT",
-    {'C','e','n','t','r','a','l',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -360, 0},
-   {"LKT",
-    {'S','r','i',' ','L','a','n','k','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -360, 0},
-   {"MMT",
-    {'M','y','a','n','m','a','r',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -390, 0},
-   {"ICT",
-    {'S','E',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -420, 0},
-   {"KRAST",
-    {'N','o','r','t','h',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -480, 1},
-   {"CST",
-    {'C','h','i','n','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -480, 0},
-   {"IRKST",
-    {'N','o','r','t','h',' ','A','s','i','a',' ','E','a','s','t',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -540, 1},
-   {"SGT",
-    {'M','a','l','a','y',' ','P','e','n','i','n','s','u','l','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -480, 0},
-   {"WST",
-    {'W','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -480, 0},
-   {"JST",
-    {'T','o','k','y','o',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -540, 0},
-   {"KST",
-    {'K','o','r','e','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -540, 0},
-   {"YAKST",
-    {'Y','a','k','u','t','s','k',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -600, 1},
-   {"CST",
-    {'C','e','n','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -570, 0},
-   {"EST",
-    {'E','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -600, 0},
-   {"GST",
-    {'W','e','s','t',' ','P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -600, 0},
-   {"VLAST",
-    {'V','l','a','d','i','v','o','s','t','o','k',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -660, 1},
-   {"MAGST",
-    {'C','e','n','t','r','a','l',' ','P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -720, 1},
-   {"NZST",
-    {'N','e','w',' ','Z','e','a','l','a','n','d',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -720, 0},
-   {"FJT",
-    {'F','i','j','i',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -720, 0},
-   {"TOT",
-    {'T','o','n','g','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
-    -780, 0}
-};
-
-/* TIME_GetTZAsStr: helper function that returns the given timezone as a string.
-   This could be done with a hash table instead of merely iterating through
-   a table, however with the small amount of entries (60 or so) I didn't think
-   it was worth it. */
-static const WCHAR* TIME_GetTZAsStr (time_t utc, int bias, int dst)
-{
-   char psTZName[7];
-   struct tm *ptm = localtime(&utc);
-   int i;
-
-   if (!strftime (psTZName, 7, "%Z", ptm))
-      return (NULL);
-
-   for (i=0; i<(sizeof(TZ_INFO) / sizeof(struct tagTZ_INFO)); i++)
-   {
-      if ( strcmp(TZ_INFO[i].psTZFromUnix, psTZName) == 0 &&
-           TZ_INFO[i].bias == bias &&
-           TZ_INFO[i].dst == dst
-         )
-            return TZ_INFO[i].psTZWindows;
-   }
-
-   return (NULL);
-}
-
-
-/* TIME_GetBias: helper function calculates delta local time from UTC */
-static int TIME_GetBias( time_t utc, int *pdaylight)
-{
-    struct tm *ptm = localtime(&utc);
-    *pdaylight = ptm->tm_isdst; /* daylight for local timezone */
-    ptm = gmtime(&utc);
-    ptm->tm_isdst = *pdaylight; /* use local daylight, not that of Greenwich */
-    return (int)(utc-mktime(ptm));
-}
-
-
 /***********************************************************************
  *              SetLocalTime            (KERNEL32.@)
  *
@@ -386,56 +142,22 @@
 BOOL WINAPI SetSystemTime(
     const SYSTEMTIME *systime) /* [in] The desired system time. */
 {
-    struct timeval tv;
-    struct timezone tz;
-    struct tm t;
-    time_t sec, oldsec;
-    int dst, bias;
-    int err;
+    TIME_FIELDS tf;
+    LARGE_INTEGER t;
 
-    /* call gettimeofday to get the current timezone */
-    gettimeofday(&tv, &tz);
-    oldsec=tv.tv_sec;
-    /* get delta local time from utc */
-    bias=TIME_GetBias(oldsec,&dst);
+    tf.Second = systime->wSecond;
+    tf.Minute = systime->wMinute;
+    tf.Hour = systime->wHour;
+    tf.Day = systime->wDay;
+    tf.Month = systime->wMonth;
+    tf.Year = systime->wYear;
+    tf.Milliseconds = systime->wMilliseconds;
 
-    /* get the number of seconds */
-    t.tm_sec = systime->wSecond;
-    t.tm_min = systime->wMinute;
-    t.tm_hour = systime->wHour;
-    t.tm_mday = systime->wDay;
-    t.tm_mon = systime->wMonth - 1;
-    t.tm_year = systime->wYear - 1900;
-    t.tm_isdst = dst;
-    sec = mktime (&t);
-    /* correct for timezone and daylight */
-    sec += bias;
+    RtlTimeFieldsToTime(&tf, &t);
 
-    /* set the new time */
-    tv.tv_sec = sec;
-    tv.tv_usec = systime->wMilliseconds * 1000;
+    NtSetSystemTime(&t, NULL);
 
-    /* error and sanity check*/
-    if( sec == (time_t)-1 || abs((int)(sec-oldsec)) > SETTIME_MAX_ADJUST ){
-        err = 1;
-        SetLastError(ERROR_INVALID_PARAMETER);
-    } else {
-#ifdef HAVE_SETTIMEOFDAY
-        err=settimeofday(&tv, NULL); /* 0 is OK, -1 is error */
-        if(err == 0)
-            return TRUE;
-        SetLastError(ERROR_PRIVILEGE_NOT_HELD);
-#else
-	err = 1;
-	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-#endif
-    }
-    ERR("Cannot set time to %d/%d/%d %d:%d:%d Time adjustment %ld %s\n",
-            systime->wYear, systime->wMonth, systime->wDay, systime->wHour,
-            systime->wMinute, systime->wSecond,
-            sec-oldsec, err == -1 ? "No Permission" :
-                sec==(time_t)-1 ? "" : "is too large." );
-    return FALSE;
+    return TRUE;
 }
 
 
@@ -452,21 +174,7 @@
 DWORD WINAPI GetTimeZoneInformation(
     LPTIME_ZONE_INFORMATION tzinfo) /* [out] The time zone structure to be filled in. */
 {
-    time_t gmt;
-    int bias, daylight;
-    const WCHAR *psTZ;
-
-
-    memset(tzinfo, 0, sizeof(TIME_ZONE_INFORMATION));
-
-    gmt = time(NULL);
-    bias=TIME_GetBias(gmt,&daylight);
-
-    tzinfo->Bias = -bias / 60;
-    tzinfo->StandardBias = 0;
-    tzinfo->DaylightBias = -60;
-    psTZ = TIME_GetTZAsStr (gmt, (-bias/60), daylight);
-    if (psTZ) strcpyW( tzinfo->StandardName, psTZ );
+    RtlQueryTimeZoneInformation(tzinfo);
     return TIME_ZONE_ID_STANDARD;
 }
 
@@ -479,23 +187,13 @@
  * RETURNS
  *
  *  True on successful setting of the time zone.
- *
- * BUGS
- *
- *  Use the obsolete unix timezone structure and tz_dsttime member.
  */
 BOOL WINAPI SetTimeZoneInformation(
     const LPTIME_ZONE_INFORMATION tzinfo) /* [in] The new time zone. */
 {
-    struct timezone tz;
-
-    tz.tz_minuteswest = tzinfo->Bias;
-#ifdef DST_NONE
-    tz.tz_dsttime = DST_NONE;
-#else
-    tz.tz_dsttime = 0;
-#endif
-    return !settimeofday(NULL, &tz);
+    if(RtlSetTimeZoneInformation(tzinfo) == STATUS_SUCCESS)
+        return TRUE;
+    return FALSE;
 }
 
 
Index: dlls/ntdll/time.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/time.c,v
retrieving revision 1.21
diff -u -r1.21 time.c
--- dlls/ntdll/time.c	6 Nov 2002 21:57:23 -0000	1.21
+++ dlls/ntdll/time.c	21 Nov 2002 17:29:55 -0000
@@ -1,5 +1,5 @@
 /*
- * Conversion between Time and TimeFields
+ * Nt time functions.
  *
  * RtlTimeToTimeFields, RtlTimeFieldsToTime and defines are taken from ReactOS and
  * adapted to wine with special permissions of the author
@@ -34,10 +34,222 @@
 # include <unistd.h>
 #endif
 #include "winternl.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
 
+#define SETTIME_MAX_ADJUST 120
+
+/* This structure is used to store strings that represent all of the time zones
+ * in the world. (This is used to help GetTimeZoneInformation)
+ */
+struct tagTZ_INFO
+{
+    const char *psTZFromUnix;
+    WCHAR psTZWindows[32];
+    int bias;
+    int dst;
+};
+
+static const struct tagTZ_INFO TZ_INFO[] =
+{
+   {"MHT",
+    {'D','a','t','e','l','i','n','e',' ','S','t','a','n','d','a','r','d',' ',
+     'T','i','m','e','\0'}, -720, 0},
+   {"SST",
+    {'S','a','m','o','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, 660, 0},
+   {"HST",
+    {'H','a','w','a','i','i','a','n',' ','S','t','a','n','d','a','r','d',' ',
+     'T','i','m','e','\0'}, 600, 0},
+   {"AKDT",
+    {'A','l','a','s','k','a','n',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, 480, 1},
+   {"PDT",
+    {'P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, 420, 1},
+   {"MST",
+    {'U','S',' ','M','o','u','n','t','a','i','n',' ','S','t','a','n','d','a',
+     'r','d',' ','T','i','m','e','\0'}, 420, 0},
+   {"MDT",
+    {'M','o','u','n','t','a','i','n',' ','S','t','a','n','d','a','r','d',' ',
+     'T','i','m','e','\0'}, 360, 1},
+   {"CST",
+    {'C','e','n','t','r','a','l',' ','A','m','e','r','i','c','a',' ','S','t',
+     'a','n','d','a','r','d',' ','T','i','m','e','\0'}, 360, 0},
+   {"CDT",
+    {'C','e','n','t','r','a','l',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, 300, 1},
+   {"COT",
+    {'S','A',' ','P','a','c','i','f','i','c',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 300, 0},
+   {"EDT",
+    {'E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, 240, 1},
+   {"EST",
+    {'U','S',' ','E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 300, 0},
+   {"ADT",
+    {'A','t','l','a','n','t','i','c',' ','S','t','a','n','d','a','r','d',' ',
+     'T','i','m','e','\0'}, 180, 1},
+   {"VET",
+    {'S','A',' ','W','e','s','t','e','r','n',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 240, 0},
+   {"CLT",
+    {'P','a','c','i','f','i','c',' ','S','A',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 240, 0},
+   {"NDT",
+    {'N','e','w','f','o','u','n','d','l','a','n','d',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, 150, 1},
+   {"BRT",
+    {'E','.',' ','S','o','u','t','h',' ','A','m','e','r','i','c','a',' ','S',
+     't','a','n','d','a','r','d',' ','T','i','m','e','\0'}, 180, 0},
+   {"ART",
+    {'S','A',' ','E','a','s','t','e','r','n',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 180, 0},
+   {"WGST",
+    {'G','r','e','e','n','l','a','n','d',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, 120, 1},
+   {"GST",
+    {'M','i','d','-','A','t','l','a','n','t','i','c',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, 120, 0},
+   {"AZOST",
+    {'A','z','o','r','e','s',' ','S','t','a','n','d','a','r','d',' ','T','i',
+     'm','e','\0'}, 0, 1},
+   {"CVT",
+    {'C','a','p','e',' ','V','e','r','d','e',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, 60, 0},
+   {"WET",
+    {'G','r','e','e','n','w','i','c','h',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, 0, 0},
+   {"BST",
+    {'G','M','T',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
+    -60, 1},
+   {"GMT",
+    {'G','M','T',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'},
+    0, 0},
+   {"CEST",
+    {'C','e','n','t','r','a','l',' ','E','u','r','o','p','e',' ','S','t','a',
+     'n','d','a','r','d',' ','T','i','m','e','\0'}, -120, 1},
+   {"WAT",
+    {'W','.',' ','C','e','n','t','r','a','l',' ','A','f','r','i','c','a',' ',
+     'S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'}, -60, 0},
+   {"EEST",
+    {'E','.',' ','E','u','r','o','p','e',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, -180, 1},
+   {"EET",
+    {'E','g','y','p','t',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -120, 0},
+   {"CAT",
+    {'S','o','u','t','h',' ','A','f','r','i','c','a',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -120, 0},
+   {"IST",
+    {'I','s','r','a','e','l',' ','S','t','a','n','d','a','r','d',' ','T','i',
+     'm','e','\0'}, -120, 0},
+   {"ADT",
+    {'A','r','a','b','i','c',' ','S','t','a','n','d','a','r','d',' ','T','i',
+     'm','e','\0'}, -240, 1},
+   {"AST",
+    {'A','r','a','b',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e',
+     '\0'}, -180, 0},
+   {"MSD",
+    {'R','u','s','s','i','a','n',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, -240, 1},
+   {"EAT",
+    {'E','.',' ','A','f','r','i','c','a',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, -180, 0},
+   {"IRST",
+    {'I','r','a','n',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e',
+     '\0'}, -270, 1},
+   {"GST",
+    {'A','r','a','b','i','a','n',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, -240, 0},
+   {"AZST",
+    {'C','a','u','c','a','s','u','s',' ','S','t','a','n','d','a','r','d',' ',
+     'T','i','m','e','\0'}, -300, 1},
+   {"AFT",
+    {'A','f','g','h','a','n','i','s','t','a','n',' ','S','t','a','n','d','a',
+     'r','d',' ','T','i','m','e','\0'}, -270, 0},
+   {"YEKST",
+    {'E','k','a','t','e','r','i','n','b','u','r','g',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -360, 1},
+   {"PKT",
+    {'W','e','s','t',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, -300, 0},
+   {"IST",
+    {'I','n','d','i','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -330, 0},
+   {"NPT",
+    {'N','e','p','a','l',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -345, 0},
+   {"ALMST",
+    {'N','.',' ','C','e','n','t','r','a','l',' ','A','s','i','a',' ','S','t',
+     'a','n','d','a','r','d',' ','T','i','m','e','\0'}, -420, 1},
+   {"BDT",
+    {'C','e','n','t','r','a','l',' ','A','s','i','a',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -360, 0},
+   {"LKT",
+    {'S','r','i',' ','L','a','n','k','a',' ','S','t','a','n','d','a','r','d',
+     ' ','T','i','m','e','\0'}, -360, 0},
+   {"MMT",
+    {'M','y','a','n','m','a','r',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, -390, 0},
+   {"ICT",
+    {'S','E',' ','A','s','i','a',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, -420, 0},
+   {"KRAST",
+    {'N','o','r','t','h',' ','A','s','i','a',' ','S','t','a','n','d','a','r',
+     'd',' ','T','i','m','e','\0'}, -480, 1},
+   {"CST",
+    {'C','h','i','n','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -480, 0},
+   {"IRKST",
+    {'N','o','r','t','h',' ','A','s','i','a',' ','E','a','s','t',' ','S','t',
+     'a','n','d','a','r','d',' ','T','i','m','e','\0'}, -540, 1},
+   {"SGT",
+    {'M','a','l','a','y',' ','P','e','n','i','n','s','u','l','a',' ','S','t',
+     'a','n','d','a','r','d',' ','T','i','m','e','\0'}, -480, 0},
+   {"WST",
+    {'W','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -480, 0},
+   {"JST",
+    {'T','o','k','y','o',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -540, 0},
+   {"KST",
+    {'K','o','r','e','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -540, 0},
+   {"YAKST",
+    {'Y','a','k','u','t','s','k',' ','S','t','a','n','d','a','r','d',' ','T',
+     'i','m','e','\0'}, -600, 1},
+   {"CST",
+    {'C','e','n','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a',
+     'n','d','a','r','d',' ','T','i','m','e','\0'}, -570, 0},
+   {"EST",
+    {'E','.',' ','A','u','s','t','r','a','l','i','a',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -600, 0},
+   {"GST",
+    {'W','e','s','t',' ','P','a','c','i','f','i','c',' ','S','t','a','n','d',
+     'a','r','d',' ','T','i','m','e','\0'}, -600, 0},
+   {"VLAST",
+    {'V','l','a','d','i','v','o','s','t','o','k',' ','S','t','a','n','d','a',
+     'r','d',' ','T','i','m','e','\0'}, -660, 1},
+   {"MAGST",
+    {'C','e','n','t','r','a','l',' ','P','a','c','i','f','i','c',' ','S','t',
+     'a','n','d','a','r','d',' ','T','i','m','e','\0'}, -720, 1},
+   {"NZST",
+    {'N','e','w',' ','Z','e','a','l','a','n','d',' ','S','t','a','n','d','a',
+     'r','d',' ','T','i','m','e','\0'}, -720, 0},
+   {"FJT",
+    {'F','i','j','i',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e',
+     '\0'}, -720, 0},
+   {"TOT",
+    {'T','o','n','g','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m',
+     'e','\0'}, -780, 0}
+};
+
+/*********** start of code by Rex Jolliff (rex at lvcablemodem.com) **************/
+
 #define TICKSPERSEC        10000000
 #define TICKSPERMSEC       10000
 #define SECSPERDAY         86400
@@ -77,10 +289,17 @@
 }
 
 /******************************************************************************
- *  RtlTimeToTimeFields		[NTDLL.@]
+ *       RtlTimeToTimeFields [NTDLL.@]
+ *
+ * Parses Time into a TimeFields structure.
+ *
+ * PARAMS:
+ *   liTime [I]: Time to convert to timefields.
+ *   TimeFields [O]: Pointer to TIME_FIELDS structure to hold parsed info.
  *
+ * RETURNS:
+ *   Nothing.
  */
-
 VOID WINAPI RtlTimeToTimeFields(
 	PLARGE_INTEGER liTime,
 	PTIME_FIELDS TimeFields)
@@ -137,8 +356,17 @@
 }
 
 /******************************************************************************
- *  RtlTimeFieldsToTime		[NTDLL.@]
+ *       RtlTimeFieldsToTime [NTDLL.@]
+ *
+ * Converts a TIME_FIELDS structure to time.
+ *
+ * PARAMS:
+ *   ftTimeFields [I]: Time fields structure to convert.
+ *   Time [O]: Converted time.
  *
+ * RETURNS:
+ *   TRUE: Successfull
+ *   FALSE: Failure.
  */
 BOOLEAN WINAPI RtlTimeFieldsToTime(
 	PTIME_FIELDS tfTimeFields,
@@ -183,10 +411,20 @@
 
 	return TRUE;
 }
-/************* end of code by Rex Jolliff (rex at lvcablemodem.com) *******************/
+/************ end of code by Rex Jolliff (rex at lvcablemodem.com) ***************/
+
 
 /******************************************************************************
- *  RtlSystemTimeToLocalTime 	[NTDLL.@]
+ *       RtlSystemTimeToLocalTime [NTDLL.@]
+ *
+ * Converts system Time to local time.
+ *
+ * PARAMS:
+ *   SystemTime [I]: System time to convert.
+ *   LocalTime [O]: Local time of the supplied system time.
+ *
+ * RETURNS:
+ *   Nothing.
  */
 VOID WINAPI RtlSystemTimeToLocalTime(
 	IN  PLARGE_INTEGER SystemTime,
@@ -198,7 +436,17 @@
 }
 
 /******************************************************************************
- *  RtlTimeToSecondsSince1970		[NTDLL.@]
+ *       RtlTimeToSecondsSince1970 [NTDLL.@]
+ *
+ * Converts Time to seconds since 1970.
+ *
+ * PARAMS:
+ *   time [I]: Time to convert.
+ *   res [O]: Pointer to a LONG to recieve the seconds since 1970.
+ *
+ * RETURNS:
+ *   TRUE: Successfull.
+ *   FALSE: Failure.
  */
 BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *time, PULONG res )
 {
@@ -211,7 +459,17 @@
 }
 
 /******************************************************************************
- *  RtlTimeToSecondsSince1980		[NTDLL.@]
+ *       RtlTimeToSecondsSince1980 [NTDLL.@]
+ *
+ * Converts Time to seconds since 1980.
+ *
+ * PARAMS:
+ *   time [I]: Time to convert.
+ *   res [O]: Pointer to a integer to recieve the time since 1980.
+ *
+ * RETURNS:
+ *   TRUE: Successfull
+ *   FALSE: Failure.
  */
 BOOLEAN WINAPI RtlTimeToSecondsSince1980( const LARGE_INTEGER *time, LPDWORD res )
 {
@@ -224,7 +482,16 @@
 }
 
 /******************************************************************************
- *  RtlSecondsSince1970ToTime		[NTDLL.@]
+ *       RtlSecondsSince1970ToTime [NTDLL.@]
+ *
+ * Converts seconds since 1970 to time.
+ *
+ * PARAMS:
+ *   time [I]: Seconds since 1970 to convert.
+ *   res [O]: Seconds since 1970 in Time.
+ *
+ * RETURNS:
+ *   Nothing.
  */
 void WINAPI RtlSecondsSince1970ToTime( DWORD time, LARGE_INTEGER *res )
 {
@@ -234,7 +501,16 @@
 }
 
 /******************************************************************************
- *  RtlSecondsSince1980ToTime		[NTDLL.@]
+ *       RtlSecondsSince1980ToTime [NTDLL.@]
+ *
+ * Converts seconds since 1980 to time.
+ *
+ * PARAMS:
+ *   time [I]: Seconds since 1980 to convert.
+ *   res [O]: Seconds since 1980 in Time.
+ *
+ * RETURNS:
+ *   Nothing.
  */
 void WINAPI RtlSecondsSince1980ToTime( DWORD time, LARGE_INTEGER *res )
 {
@@ -244,8 +520,19 @@
 }
 
 /******************************************************************************
- * RtlTimeToElapsedTimeFields [NTDLL.@]
- * FIXME: prototype guessed
+ *       RtlTimeToElapsedTimeFields [NTDLL.@]
+ *
+ * ??
+ *
+ * PARAMS:
+ *   liTime [?]: ??
+ *   TimeFields [?]: ??
+ *
+ * RETURNS:
+ *   Nothing.
+ *
+ * FIXME:
+ *   Prototype guessed.
  */
 VOID WINAPI RtlTimeToElapsedTimeFields(
 	PLARGE_INTEGER liTime,
@@ -255,8 +542,16 @@
 }
 
 /***********************************************************************
- *      NtQuerySystemTime   (NTDLL.@)
- *      ZwQuerySystemTime   (NTDLL.@)
+ *       NtQuerySystemTime [NTDLL.@]
+ *       ZwQuerySystemTime [NTDLL.@]
+ *
+ * Gets the current system time.
+ *
+ * PARAMS:
+ *   time [O]: The current system time.
+ *
+ * RETURNS:
+ *   Status.
  */
 NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER time )
 {
@@ -268,4 +563,200 @@
     time->s.LowPart  = (DWORD)secs;
     time->s.HighPart = (DWORD)(secs >> 32);
     return STATUS_SUCCESS;
+}
+
+/***********************************************************************
+ *       TIME_GetBias [internal]
+ *
+ * Helper function calculates delta local time from UTC. 
+ *
+ * PARAMS:
+ *   utc [I]: The current utc time.
+ *   pdaylight [I]: Local daylight.
+ *
+ * RETURNS:
+ *   The bias for the current timezone.
+ */
+static int TIME_GetBias(time_t utc, int *pdaylight)
+{
+    struct tm *ptm = localtime(&utc);
+    *pdaylight = ptm->tm_isdst; /* daylight for local timezone */
+    ptm = gmtime(&utc);
+    ptm->tm_isdst = *pdaylight; /* use local daylight, not that of Greenwich */
+    return (int)(utc-mktime(ptm));
+}
+
+/***********************************************************************
+ *        TIME_GetTZAsStr [internal]
+ *
+ * Helper function that returns the given timezone as a string.
+ *
+ * PARAMS:
+ *   utc [I]: The current utc time.
+ *   bias [I]: The bias of the current timezone.
+ *   dst [I]: ??
+ *
+ * RETURNS:
+ *   Timezone name.
+ *
+ * NOTES:
+ *   This could be done with a hash table instead of merely iterating through a
+ *   table, however with the small amount of entries (60 or so) I didn't think
+ *   it was worth it.
+ */
+static const WCHAR* TIME_GetTZAsStr (time_t utc, int bias, int dst)
+{
+   char psTZName[7];
+   struct tm *ptm = localtime(&utc);
+   int i;
+
+   if (!strftime (psTZName, 7, "%Z", ptm))
+      return (NULL);
+
+   for (i=0; i<(sizeof(TZ_INFO) / sizeof(struct tagTZ_INFO)); i++)
+   {
+      if ( strcmp(TZ_INFO[i].psTZFromUnix, psTZName) == 0 &&
+           TZ_INFO[i].bias == bias &&
+           TZ_INFO[i].dst == dst
+         )
+            return TZ_INFO[i].psTZWindows;
+   }
+
+   return (NULL);
+}
+
+/***********************************************************************
+ *      RtlQueryTimeZoneInformation [NTDLL.@]
+ *
+ * Returns the timezone.
+ *
+ * PARAMS:
+ *   tzinfo [O]: Retrieves the timezone info.
+ *
+ * RETURNS:
+ *   Status.
+ */
+NTSTATUS WINAPI RtlQueryTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
+{
+    time_t gmt;
+    int bias, daylight;
+    const WCHAR *psTZ;
+
+    memset(tzinfo, 0, sizeof(TIME_ZONE_INFORMATION));
+
+    gmt = time(NULL);
+    bias = TIME_GetBias(gmt, &daylight);
+
+    tzinfo->Bias = -bias / 60;
+    tzinfo->StandardBias = 0;
+    tzinfo->DaylightBias = -60;
+    psTZ = TIME_GetTZAsStr (gmt, (-bias/60), daylight);
+    if (psTZ) strcpyW( tzinfo->StandardName, psTZ );
+    return STATUS_SUCCESS;
+}
+
+/***********************************************************************
+ *       RtlSetTimeZoneInformation [NTDLL.@]
+ *
+ * Sets the current time zone.
+ *
+ * PARAMS:
+ *   tzinfo [I]: Timezone information used to set timezone.
+ *
+ * RETURNS:
+ *   Status.
+ *
+ * BUGS:
+ *   Uses the obsolete unix timezone structure and tz_dsttime member.
+ */
+NTSTATUS WINAPI RtlSetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
+{
+    struct timezone tz;
+
+    tz.tz_minuteswest = tzinfo->Bias;
+#ifdef DST_NONE
+    tz.tz_dsttime = DST_NONE;
+#else
+    tz.tz_dsttime = 0;
+#endif
+    if(!settimeofday(NULL, &tz))
+        return STATUS_SUCCESS;
+    return STATUS_PRIVILEGE_NOT_HELD;
+}
+
+/***********************************************************************
+ *        NtSetSystemTime [NTDLL.@]
+ *        ZwSetSystemTime [NTDLL.@]
+ *
+ * Sets the system time.
+ *
+ * PARAM:
+ *   NewTime [I]: The time to set the system time to.
+ *   OldTime [O]: Optional (ie. can be NULL).  Old Time.
+ *
+ * RETURNS:
+ *   Status.
+ */
+NTSTATUS WINAPI NtSetSystemTime(IN PLARGE_INTEGER NewTime, OUT PLARGE_INTEGER OldTime)
+{
+    TIME_FIELDS tf;
+    struct timeval tv;
+    struct timezone tz;
+    struct tm t;
+    time_t sec, oldsec;
+    int dst, bias;
+    int err;
+
+    /* Return the old time if necessary */
+    if(OldTime)
+        NtQuerySystemTime(OldTime);
+
+    RtlTimeToTimeFields(NewTime, &tf);
+
+    /* call gettimeofday to get the current timezone */
+    gettimeofday(&tv, &tz);
+    oldsec = tv.tv_sec;
+    /* get delta local time from utc */
+    bias = TIME_GetBias(oldsec, &dst);
+
+    /* get the number of seconds */
+    t.tm_sec = tf.Second;
+    t.tm_min = tf.Minute;
+    t.tm_hour = tf.Hour;
+    t.tm_mday = tf.Day;
+    t.tm_mon = tf.Month - 1;
+    t.tm_year = tf.Year - 1900;
+    t.tm_isdst = dst;
+    sec = mktime (&t);
+    /* correct for timezone and daylight */
+    sec += bias;
+
+    /* set the new time */
+    tv.tv_sec = sec;
+    tv.tv_usec = tf.Milliseconds * 1000;
+
+    /* error and sanity check*/
+    if(sec == (time_t)-1 || abs((int)(sec-oldsec)) > SETTIME_MAX_ADJUST) {
+        err = 2;
+    } else {
+#ifdef HAVE_SETTIMEOFDAY
+        err = settimeofday(&tv, NULL); /* 0 is OK, -1 is error */
+        if(err == 0)
+            return STATUS_SUCCESS;
+#else
+        err = 1;
+#endif
+    }
+
+    ERR("Cannot set time to %d/%d/%d %d:%d:%d Time adjustment %ld %s\n",
+            tf.Year, tf.Month, tf.Day, tf.Hour, tf.Minute, tf.Second,
+            sec-oldsec, err == -1 ? "No Permission" :
+                sec == (time_t)-1 ? "" : "is too large." );
+
+    if(err == 2)
+        return STATUS_INVALID_PARAMETER;
+    else if(err == -1)
+        return STATUS_PRIVILEGE_NOT_HELD;
+    else
+        return STATUS_NOT_IMPLEMENTED;
 }
Index: dlls/ntdll/ntdll.spec
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/ntdll.spec,v
retrieving revision 1.80
diff -u -r1.80 ntdll.spec
--- dlls/ntdll/ntdll.spec	12 Nov 2002 02:17:34 -0000	1.80
+++ dlls/ntdll/ntdll.spec	21 Nov 2002 17:30:00 -0000
@@ -225,7 +225,7 @@
 @ stub NtSetSystemEnvironmentValue
 @ stub NtSetSystemInformation
 @ stub NtSetSystemPowerState
-@ stub NtSetSystemTime
+@ stdcall NtSetSystemTime(ptr ptr) NtSetSystemTime
 @ stdcall NtSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
 @ stub NtSetTimerResolution
 @ stdcall NtSetValueKey(long long long long long long) NtSetValueKey
@@ -481,7 +481,7 @@
 @ stub RtlQueryRegistryValues
 @ stub RtlQuerySecurityObject
 @ stub RtlQueryTagHeap
-@ stub RtlQueryTimeZoneInformation
+@ stdcall RtlQueryTimeZoneInformation(ptr) RtlQueryTimeZoneInformation
 @ stdcall RtlRaiseException(ptr) RtlRaiseException
 @ stdcall RtlRaiseStatus(long) RtlRaiseStatus
 @ stub RtlRandom
@@ -508,7 +508,7 @@
 @ stdcall RtlSetOwnerSecurityDescriptor(ptr ptr long) RtlSetOwnerSecurityDescriptor
 @ stdcall RtlSetSaclSecurityDescriptor(ptr long ptr long) RtlSetSaclSecurityDescriptor
 @ stub RtlSetSecurityObject
-@ stub RtlSetTimeZoneInformation
+@ stdcall RtlSetTimeZoneInformation(ptr) RtlSetTimeZoneInformation
 @ stub RtlSetUserFlagsHeap
 @ stub RtlSetUserValueHeap
 @ stdcall RtlSizeHeap(long long ptr) RtlSizeHeap
@@ -740,7 +740,7 @@
 @ stub ZwSetSystemEnvironmentValue
 @ stub ZwSetSystemInformation
 @ stub ZwSetSystemPowerState
-@ stub ZwSetSystemTime
+@ stdcall ZwSetSystemTime(ptr ptr) NtSetSystemTime
 @ stdcall ZwSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
 @ stub ZwSetTimerResolution
 @ stdcall ZwSetValueKey(long long long long long long) NtSetValueKey



More information about the wine-patches mailing list