Implement RtlCutoverTimeToSystemTime().
Modified: trunk/reactos/include/ntos/rtl.h
Modified: trunk/reactos/lib/ntdll/def/ntdll.def
Modified: trunk/reactos/lib/rtl/time.c
_____
Modified: trunk/reactos/include/ntos/rtl.h
--- trunk/reactos/include/ntos/rtl.h 2005-01-04 19:06:48 UTC (rev
12795)
+++ trunk/reactos/include/ntos/rtl.h 2005-01-04 20:10:11 UTC (rev
12796)
@@ -878,6 +878,12 @@
ULONG CustomSize
);
+BOOLEAN STDCALL
+RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields,
+ OUT PLARGE_INTEGER SystemTime,
+ IN PLARGE_INTEGER CurrentTime,
+ IN ULONG Unknown);
+
NTSTATUS STDCALL
RtlDecompressBuffer(IN USHORT CompressionFormat,
OUT PUCHAR UncompressedBuffer,
_____
Modified: trunk/reactos/lib/ntdll/def/ntdll.def
--- trunk/reactos/lib/ntdll/def/ntdll.def 2005-01-04 19:06:48 UTC
(rev 12795)
+++ trunk/reactos/lib/ntdll/def/ntdll.def 2005-01-04 20:10:11 UTC
(rev 12796)
@@ -1,4 +1,4 @@
-; $Id: ntdll.def,v 1.135 2004/12/05 21:16:01 navaraf Exp $
+; $Id$
;
; ReactOS Operating System
;
@@ -370,7 +370,7 @@
;RtlCreateUserSecurityObject
RtlCreateUserThread@40
RtlCustomCPToUnicodeN@24
-;RtlCutoverTimeToSystemTime
+RtlCutoverTimeToSystemTime@16
RtlDeNormalizeProcessParams@4
RtlDecompressBuffer@24
RtlDecompressFragment@32
_____
Modified: trunk/reactos/lib/rtl/time.c
--- trunk/reactos/lib/rtl/time.c 2005-01-04 19:06:48 UTC (rev
12795)
+++ trunk/reactos/lib/rtl/time.c 2005-01-04 20:10:11 UTC (rev
12796)
@@ -1,4 +1,4 @@
-/* $Id: time.c,v 1.2 2004/12/16 23:46:41 ekohl Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@@ -48,9 +48,7 @@
};
static const int MonthLengths[2][MONSPERYEAR] =
{
- {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- },
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
@@ -72,11 +70,94 @@
/*
* @implemented
*/
+BOOLEAN STDCALL
+RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields,
+ OUT PLARGE_INTEGER SystemTime,
+ IN PLARGE_INTEGER CurrentTime,
+ IN ULONG Unknown)
+{
+ TIME_FIELDS AdjustedTimeFields;
+ TIME_FIELDS CurrentTimeFields;
+ TIME_FIELDS CutoverSystemTimeFields;
+ LARGE_INTEGER CutoverSystemTime;
+ CSHORT MonthLength;
+ CSHORT Days;
+
+ /* Check fixed cutover time */
+ if (CutoverTimeFields->Year != 0)
+ {
+ if (!RtlTimeFieldsToTime(CutoverTimeFields, SystemTime))
+ return FALSE;
+
+ if (SystemTime->QuadPart < CurrentTime->QuadPart)
+ return FALSE;
+
+ return TRUE;
+ }
+
+ /*
+ * Compute recurring cutover time
+ */
+
+ /* Day must be between 1(first) and 5(last) */
+ if (CutoverTimeFields->Day == 0 || CutoverTimeFields->Day > 5)
+ return FALSE;
+
+ 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;
+
+ if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
+ return FALSE;
+
+ RtlTimeToTimeFields(&CutoverSystemTime, &CutoverSystemTimeFields);
+
+ /* 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);
+
+ AdjustedTimeFields.Day += Days;
+ }
+
+ /* Adjust the number of weeks */
+ if (CutoverTimeFields->Day > 1)
+ {
+ Days = DAYSPERWEEK * (CutoverTimeFields->Day - 1);
+ MonthLength =
MonthLengths[IsLeapYear(AdjustedTimeFields.Year)][AdjustedTimeFields.Mon
th - 1];
+ if ((AdjustedTimeFields.Day + Days) > MonthLength)
+ Days -= DAYSPERWEEK;
+
+ AdjustedTimeFields.Day += Days;
+ }
+
+ if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime))
+ return FALSE;
+
+ SystemTime->QuadPart = CutoverSystemTime.QuadPart;
+
+ return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
BOOLEAN
STDCALL
RtlTimeFieldsToTime(
- PTIME_FIELDS TimeFields,
- PLARGE_INTEGER Time)
+ IN PTIME_FIELDS TimeFields,
+ OUT PLARGE_INTEGER Time)
{
int CurYear;
int CurMonth;
@@ -179,13 +260,13 @@
/*
- * @unimplemented
+ * @implemented
*/
VOID
STDCALL
RtlTimeToTimeFields(
- PLARGE_INTEGER Time,
- PTIME_FIELDS TimeFields)
+ IN PLARGE_INTEGER Time,
+ OUT PTIME_FIELDS TimeFields)
{
const int *Months;
int SecondsInDay, CurYear;
@@ -230,7 +311,6 @@
Days += CurYear - CurYear / 4 + CurYear / 100 - CurYear / 400;
CurYear++;
Days -= EPOCHYEAR - 1 - (EPOCHYEAR -1) / 4 + (EPOCHYEAR -1) / 100 -
(EPOCHYEAR - 1) / 400;
- /* FIXME: handle calendar modifications */
while (1)
{
LeapYear = IsLeapYear(CurYear);
@@ -259,8 +339,8 @@
BOOLEAN
STDCALL
RtlTimeToSecondsSince1970(
- PLARGE_INTEGER Time,
- PULONG SecondsSince1970)
+ IN PLARGE_INTEGER Time,
+ OUT PULONG SecondsSince1970)
{
LARGE_INTEGER IntTime;
@@ -282,8 +362,8 @@
BOOLEAN
STDCALL
RtlTimeToSecondsSince1980(
- PLARGE_INTEGER Time,
- PULONG SecondsSince1980)
+ IN PLARGE_INTEGER Time,
+ OUT PULONG SecondsSince1980)
{
LARGE_INTEGER IntTime;
@@ -304,8 +384,8 @@
*/
NTSTATUS
STDCALL
-RtlLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
- PLARGE_INTEGER SystemTime)
+RtlLocalTimeToSystemTime(IN PLARGE_INTEGER LocalTime,
+ OUT PLARGE_INTEGER SystemTime)
{
SYSTEM_TIMEOFDAY_INFORMATION TimeInformation;
NTSTATUS Status;
@@ -315,12 +395,12 @@
sizeof(SYSTEM_TIMEOFDAY_INFORMATION),
NULL);
if (!NT_SUCCESS(Status))
- return(Status);
+ return Status;
SystemTime->QuadPart = LocalTime->QuadPart +
TimeInformation.TimeZoneBias.QuadPart;
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
@@ -329,8 +409,8 @@
*/
NTSTATUS
STDCALL
-RtlSystemTimeToLocalTime(PLARGE_INTEGER SystemTime,
- PLARGE_INTEGER LocalTime)
+RtlSystemTimeToLocalTime(IN PLARGE_INTEGER SystemTime,
+ OUT PLARGE_INTEGER LocalTime)
{
SYSTEM_TIMEOFDAY_INFORMATION TimeInformation;
NTSTATUS Status;
@@ -340,36 +420,34 @@
sizeof(SYSTEM_TIMEOFDAY_INFORMATION),
NULL);
if (!NT_SUCCESS(Status))
- return(Status);
+ return Status;
LocalTime->QuadPart = SystemTime->QuadPart -
TimeInformation.TimeZoneBias.QuadPart;
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
/*
* @implemented
*/
-VOID
-STDCALL
+VOID STDCALL
RtlSecondsSince1970ToTime(
- ULONG SecondsSince1970,
- PLARGE_INTEGER Time)
+ IN ULONG SecondsSince1970,
+ OUT PLARGE_INTEGER Time)
{
- Time->QuadPart = ((LONGLONG)SecondsSince1970 * TICKSPERSEC) +
TICKSTO1970;
+ Time->QuadPart = ((LONGLONG)SecondsSince1970 * TICKSPERSEC) +
TICKSTO1970;
}
/*
* @implemented
*/
-VOID
-STDCALL
+VOID STDCALL
RtlSecondsSince1980ToTime(
- ULONG SecondsSince1980,
- PLARGE_INTEGER Time)
+ IN ULONG SecondsSince1980,
+ OUT PLARGE_INTEGER Time)
{
Time->QuadPart = ((LONGLONG)SecondsSince1980 * TICKSPERSEC) +
TICKSTO1980;
}