RtlCutoverTimeToSystemTime(): The 4th argument determines whether the cutover time of the current year or the next cutover time is calculated.
Modified: trunk/reactos/include/ntos/rtl.h
Modified: trunk/reactos/lib/rtl/time.c

Modified: trunk/reactos/include/ntos/rtl.h
--- trunk/reactos/include/ntos/rtl.h	2005-01-07 09:21:53 UTC (rev 12863)
+++ trunk/reactos/include/ntos/rtl.h	2005-01-07 12:58:46 UTC (rev 12864)
@@ -112,7 +112,7 @@
 InsertHeadList(
 	IN PLIST_ENTRY  ListHead,
 	IN PLIST_ENTRY  Entry)
-{ 
+{
 	PLIST_ENTRY OldFlink;
 	OldFlink = ListHead->Flink;
 	Entry->Flink = OldFlink;
@@ -140,7 +140,7 @@
 InsertTailList(
 	IN PLIST_ENTRY  ListHead,
 	IN PLIST_ENTRY  Entry)
-{ 
+{
 	PLIST_ENTRY OldBlink;
 	OldBlink = ListHead->Blink;
 	Entry->Flink = ListHead;
@@ -882,7 +882,7 @@
 RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields,
                            OUT PLARGE_INTEGER SystemTime,
                            IN PLARGE_INTEGER CurrentTime,
-                           IN ULONG Unknown);
+                           IN BOOLEAN ThisYearsCutoverOnly);
 
 NTSTATUS STDCALL
 RtlDecompressBuffer(IN USHORT CompressionFormat,

Modified: trunk/reactos/lib/rtl/time.c
--- trunk/reactos/lib/rtl/time.c	2005-01-07 09:21:53 UTC (rev 12863)
+++ trunk/reactos/lib/rtl/time.c	2005-01-07 12:58:46 UTC (rev 12864)
@@ -74,7 +74,7 @@
 RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields,
                            OUT PLARGE_INTEGER SystemTime,
                            IN PLARGE_INTEGER CurrentTime,
-                           IN ULONG Unknown)
+                           IN BOOLEAN ThisYearsCutoverOnly)
 {
   TIME_FIELDS AdjustedTimeFields;
   TIME_FIELDS CurrentTimeFields;
@@ -82,6 +82,7 @@
   LARGE_INTEGER CutoverSystemTime;
   CSHORT MonthLength;
   CSHORT Days;
+  BOOLEAN NextYearsCutover = FALSE;
 
   /* Check fixed cutover time */
   if (CutoverTimeFields->Year != 0)
@@ -105,45 +106,60 @@
 
   RtlTimeToTimeFields(CurrentTime, &CurrentTimeFields);
 
-  /* Compute the cutover time of the first day of the current month */
-  AdjustedTimeFields.Year = CurrentTimeFields.Year;
-  AdjustedTimeFields.Month = CutoverTimeFields->Month;
-  AdjustedTimeFields.Day = 1;
-  AdjustedTimeFields.Hour = CutoverTimeFields->Hour;
-  AdjustedTimeFields.Minute = CutoverTimeFields->Minute;
-  AdjustedTimeFields.Second = CutoverTimeFields->Second;
-  AdjustedTimeFields.Milliseconds = CutoverTimeFields->Milliseconds;
+  while (TRUE)
+  {
+    /* Compute the cutover time of the first day of the current month */
+    AdjustedTimeFields.Year = CurrentTimeFields.Year;
+    if (NextYearsCutover == TRUE)
+      AdjustedTimeFields.Year++;
 
-  if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
-    return FALSE;
+    AdjustedTimeFields.Month = CutoverTimeFields->Month;
+    AdjustedTimeFields.Day = 1;
+    AdjustedTimeFields.Hour = CutoverTimeFields->Hour;
+    AdjustedTimeFields.Minute = CutoverTimeFields->Minute;
+    AdjustedTimeFields.Second = CutoverTimeFields->Second;
+    AdjustedTimeFields.Milliseconds = CutoverTimeFields->Milliseconds;
 
-  RtlTimeToTimeFields(&CutoverSystemTime, &CutoverSystemTimeFields);
+    if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
+      return FALSE;
 
-  /* Adjust day to first matching weekday */
-  if (CutoverSystemTimeFields.Weekday != CutoverTimeFields->Weekday)
-  {
-    if (CutoverSystemTimeFields.Weekday < CutoverTimeFields->Weekday)
-      Days = CutoverTimeFields->Weekday - CutoverSystemTimeFields.Weekday;
-    else
-      Days = DAYSPERWEEK - (CutoverSystemTimeFields.Weekday - CutoverTimeFields->Weekday);
+    RtlTimeToTimeFields(&CutoverSystemTime, &CutoverSystemTimeFields);
 
-    AdjustedTimeFields.Day += Days;
-  }
+    /* Adjust day to first matching weekday */
+    if (CutoverSystemTimeFields.Weekday != CutoverTimeFields->Weekday)
+    {
+      if (CutoverSystemTimeFields.Weekday < CutoverTimeFields->Weekday)
+        Days = CutoverTimeFields->Weekday - CutoverSystemTimeFields.Weekday;
+      else
+        Days = DAYSPERWEEK - (CutoverSystemTimeFields.Weekday - CutoverTimeFields->Weekday);
 
-  /* Adjust the number of weeks */
-  if (CutoverTimeFields->Day > 1)
-  {
-    Days = DAYSPERWEEK * (CutoverTimeFields->Day - 1);
-    MonthLength = MonthLengths[IsLeapYear(AdjustedTimeFields.Year)][AdjustedTimeFields.Month - 1];
-    if ((AdjustedTimeFields.Day + Days) > MonthLength)
-      Days -= DAYSPERWEEK;
+      AdjustedTimeFields.Day += Days;
+    }
 
-    AdjustedTimeFields.Day += Days;
+    /* Adjust the number of weeks */
+    if (CutoverTimeFields->Day > 1)
+    {
+      Days = DAYSPERWEEK * (CutoverTimeFields->Day - 1);
+      MonthLength = MonthLengths[IsLeapYear(AdjustedTimeFields.Year)][AdjustedTimeFields.Month - 1];
+      if ((AdjustedTimeFields.Day + Days) > MonthLength)
+        Days -= DAYSPERWEEK;
+
+      AdjustedTimeFields.Day += Days;
+    }
+
+    if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
+      return FALSE;
+
+    if (ThisYearsCutoverOnly == TRUE ||
+        NextYearsCutover == TRUE ||
+        CutoverSystemTime.QuadPart >= CurrentTime->QuadPart)
+    {
+      break;
+    }
+
+    NextYearsCutover = TRUE;
   }
 
-  if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
-    return FALSE;
-
   SystemTime->QuadPart = CutoverSystemTime.QuadPart;
 
   return TRUE;