Avoid casts between LARGE_INTEGER and FILETIME. Fixed day of week of epoch. Small cleanups.
diff --git a/dlls/kernel/time.c b/dlls/kernel/time.c index af4b181..ddd4218 100644 --- a/dlls/kernel/time.c +++ b/dlls/kernel/time.c
@@ -60,14 +60,15 @@ const SYSTEMTIME *systime) /* [in] The desired local time. */ { FILETIME ft; - LARGE_INTEGER st; + LARGE_INTEGER st, st2; NTSTATUS status; SystemTimeToFileTime( systime, &ft ); + st.s.LowPart = ft.dwLowDateTime; + st.s.HighPart = ft.dwHighDateTime; + RtlLocalTimeToSystemTime( &st, &st2 ); - RtlLocalTimeToSystemTime( (PLARGE_INTEGER)&ft, &st ); - - if ((status = NtSetSystemTime(&st, NULL))) + if ((status = NtSetSystemTime(&st2, NULL))) SetLastError( RtlNtStatusToDosError(status) ); return !status; } @@ -112,11 +113,13 @@ BOOL WINAPI SetSystemTime( const SYSTEMTIME *systime) /* [in] The desired system time. */ { + FILETIME ft; LARGE_INTEGER t; NTSTATUS status; - SystemTimeToFileTime( systime, (PFILETIME)&t ); - + SystemTimeToFileTime( systime, &ft ); + t.s.LowPart = ft.dwLowDateTime; + t.s.HighPart = ft.dwHighDateTime; if ((status = NtSetSystemTime(&t, NULL))) SetLastError( RtlNtStatusToDosError(status) ); return !status; @@ -194,7 +197,10 @@ VOID WINAPI GetSystemTimeAsFileTime( LPFILETIME time) /* [out] The file time struct to be filled with the system time. */ { - NtQuerySystemTime( (LARGE_INTEGER *)time ); + LARGE_INTEGER t; + NtQuerySystemTime( &t ); + time->dwLowDateTime = t.s.LowPart; + time->dwHighDateTime = t.s.HighPart; } @@ -435,26 +441,40 @@ /********************************************************************* * LocalFileTimeToFileTime (KERNEL32.@) */ -BOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft, - LPFILETIME utcft ) +BOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft, LPFILETIME utcft ) { NTSTATUS status; - if ((status = RtlLocalTimeToSystemTime((PLARGE_INTEGER)localft, - (PLARGE_INTEGER)utcft))) - SetLastError( RtlNtStatusToDosError(status) ); + LARGE_INTEGER local, utc; + + local.s.LowPart = localft->dwLowDateTime; + local.s.HighPart = localft->dwHighDateTime; + if (!(status = RtlLocalTimeToSystemTime( &local, &utc ))) + { + utcft->dwLowDateTime = utc.s.LowPart; + utcft->dwHighDateTime = utc.s.HighPart; + } + else SetLastError( RtlNtStatusToDosError(status) ); + return !status; } /********************************************************************* * FileTimeToLocalFileTime (KERNEL32.@) */ -BOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft, - LPFILETIME localft ) +BOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft, LPFILETIME localft ) { NTSTATUS status; - if ((status = RtlSystemTimeToLocalTime((PLARGE_INTEGER)utcft, - (PLARGE_INTEGER)localft))) - SetLastError( RtlNtStatusToDosError(status) ); + LARGE_INTEGER local, utc; + + utc.s.LowPart = utcft->dwLowDateTime; + utc.s.HighPart = utcft->dwHighDateTime; + if (!(status = RtlSystemTimeToLocalTime( &utc, &local ))) + { + localft->dwLowDateTime = local.s.LowPart; + localft->dwHighDateTime = local.s.HighPart; + } + else SetLastError( RtlNtStatusToDosError(status) ); + return !status; } @@ -464,8 +484,11 @@ BOOL WINAPI FileTimeToSystemTime( const FILETIME *ft, LPSYSTEMTIME syst ) { TIME_FIELDS tf; + LARGE_INTEGER t; - RtlTimeToTimeFields((PLARGE_INTEGER)ft, &tf); + t.s.LowPart = ft->dwLowDateTime; + t.s.HighPart = ft->dwHighDateTime; + RtlTimeToTimeFields(&t, &tf); syst->wYear = tf.Year; syst->wMonth = tf.Month; @@ -484,6 +507,7 @@ BOOL WINAPI SystemTimeToFileTime( const SYSTEMTIME *syst, LPFILETIME ft ) { TIME_FIELDS tf; + LARGE_INTEGER t; tf.Year = syst->wYear; tf.Month = syst->wMonth; @@ -493,14 +517,16 @@ tf.Second = syst->wSecond; tf.Milliseconds = syst->wMilliseconds; - RtlTimeFieldsToTime(&tf, (PLARGE_INTEGER)ft); + RtlTimeFieldsToTime(&tf, &t); + ft->dwLowDateTime = t.s.LowPart; + ft->dwHighDateTime = t.s.HighPart; return TRUE; } /********************************************************************* * CompareFileTime (KERNEL32.@) */ -INT WINAPI CompareFileTime( LPFILETIME x, LPFILETIME y ) +INT WINAPI CompareFileTime( const FILETIME *x, const FILETIME *y ) { if (!x || !y) return -1; @@ -521,12 +547,12 @@ VOID WINAPI GetLocalTime(LPSYSTEMTIME systime) { FILETIME lft; - LARGE_INTEGER ft; + LARGE_INTEGER ft, ft2; NtQuerySystemTime(&ft); - - RtlSystemTimeToLocalTime(&ft, (PLARGE_INTEGER)&lft); - + RtlSystemTimeToLocalTime(&ft, &ft2); + lft.dwLowDateTime = ft2.s.LowPart; + lft.dwHighDateTime = ft2.s.HighPart; FileTimeToSystemTime(&lft, systime); } @@ -536,8 +562,10 @@ VOID WINAPI GetSystemTime(LPSYSTEMTIME systime) { FILETIME ft; + LARGE_INTEGER t; - NtQuerySystemTime((PLARGE_INTEGER)&ft); - + NtQuerySystemTime(&t); + ft.dwLowDateTime = t.s.LowPart; + ft.dwHighDateTime = t.s.HighPart; FileTimeToSystemTime(&ft, systime); }
diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index c14dcd8..aee7e48 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c
@@ -258,7 +258,7 @@ #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 -#define EPOCHWEEKDAY 0 +#define EPOCHWEEKDAY 1 /* Jan 1, 1601 was Monday */ #define DAYSPERWEEK 7 #define EPOCHYEAR 1601 #define DAYSPERNORMALYEAR 365 @@ -309,11 +309,7 @@ int SecondsInDay, CurYear; int LeapYear, CurMonth; long int Days; - LONGLONG Time; - - Time = liTime->s.HighPart; - Time <<= 32; - Time += liTime->s.LowPart; + LONGLONG Time = liTime->QuadPart; /* Extract millisecond from time and convert time into seconds */ TimeFields->Milliseconds = (CSHORT) ((Time % TICKSPERSEC) / TICKSPERMSEC); @@ -408,7 +404,7 @@ rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + TimeFields.Second; rcTime *= TICKSPERSEC; rcTime += TimeFields.Milliseconds * TICKSPERMSEC; - *Time = *(LARGE_INTEGER *)&rcTime; + Time->QuadPart = rcTime; return TRUE; } @@ -582,13 +578,10 @@ */ NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER time ) { - ULONGLONG secs; struct timeval now; gettimeofday( &now, 0 ); - secs = RtlExtendedIntegerMultiply( now.tv_sec+SECS_1601_TO_1970, 10000000 ) + now.tv_usec * 10; - time->s.LowPart = (DWORD)secs; - time->s.HighPart = (DWORD)(secs >> 32); + time->QuadPart = RtlExtendedIntegerMultiply( now.tv_sec+SECS_1601_TO_1970, 10000000 ) + now.tv_usec * 10; return STATUS_SUCCESS; }
diff --git a/include/winbase.h b/include/winbase.h index 02267ac..95c83ef 100644 --- a/include/winbase.h +++ b/include/winbase.h
@@ -1177,7 +1177,7 @@ BOOL WINAPI CopyFileExW(LPCWSTR, LPCWSTR, LPPROGRESS_ROUTINE, LPVOID, LPBOOL, DWORD); #define CopyFileEx WINELIB_NAME_AW(CopyFileEx) BOOL WINAPI CopySid(DWORD,PSID,PSID); -INT WINAPI CompareFileTime(LPFILETIME,LPFILETIME); +INT WINAPI CompareFileTime(const FILETIME*,const FILETIME*); HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCSTR); HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCWSTR); #define CreateEvent WINELIB_NAME_AW(CreateEvent)