RtlSystemTimeToLocalTime and RtlLocalTimeToSystemTime
György 'Nog' Jeney
nog at sdf.lonestar.org
Fri Nov 29 11:32:04 CST 2002
ChangeLog:
* dlls/ntdll/ntdll.spec
* dlls/ntdll/time.c
* files/dos_fs.c
* include/wintrnl.h
* dlls/kernel/time.c
- Implement RtlSystemTimeToLocalTime and RtlLocalTimeToSystemTime.
- Use new time functions in ntdll to reimplement FileTimeToLocalTime and
LocalTimeToFileTime.
nog.
-------------- next part --------------
--- ../cleanwine/include/winternl.h 2002-11-25 08:58:12.000000000 +0200
+++ include/winternl.h 2002-11-29 09:07:53.000000000 +0200
@@ -1034,7 +1034,7 @@
ULONG WINAPI RtlSizeHeap(HANDLE,ULONG,PVOID);
LPDWORD WINAPI RtlSubAuthoritySid(PSID,DWORD);
LPBYTE WINAPI RtlSubAuthorityCountSid(PSID);
-void WINAPI RtlSystemTimeToLocalTime(PLARGE_INTEGER,PLARGE_INTEGER);
+NTSTATUS WINAPI RtlSystemTimeToLocalTime(PLARGE_INTEGER,PLARGE_INTEGER);
void WINAPI RtlTimeToTimeFields(const LARGE_INTEGER*,PTIME_FIELDS);
BOOLEAN WINAPI RtlTimeFieldsToTime(PTIME_FIELDS,PLARGE_INTEGER);
--- ../cleanwine/files/dos_fs.c 2002-11-21 09:37:00.000000000 +0200
+++ files/dos_fs.c 2002-11-29 08:54:47.000000000 +0200
@@ -2481,56 +2481,6 @@
return TRUE;
}
-
-/***********************************************************************
- * LocalFileTimeToFileTime (KERNEL32.@)
- */
-BOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft,
- LPFILETIME utcft )
-{
- struct tm *xtm;
- DWORD remainder;
- time_t utctime;
-
- /* Converts from local to UTC. */
- time_t localtime = DOSFS_FileTimeToUnixTime( localft, &remainder );
- xtm = gmtime( &localtime );
- utctime = mktime(xtm);
- if(xtm->tm_isdst > 0) utctime-=3600;
- DOSFS_UnixTimeToFileTime( utctime, utcft, remainder );
- return TRUE;
-}
-
-
-/***********************************************************************
- * FileTimeToLocalFileTime (KERNEL32.@)
- */
-BOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft,
- LPFILETIME localft )
-{
- DWORD remainder;
- /* Converts from UTC to local. */
- time_t unixtime = DOSFS_FileTimeToUnixTime( utcft, &remainder );
-#ifdef HAVE_TIMEGM
- struct tm *xtm = localtime( &unixtime );
- time_t localtime;
-
- localtime = timegm(xtm);
- DOSFS_UnixTimeToFileTime( localtime, localft, remainder );
-
-#else
- struct tm *xtm;
- time_t time;
-
- xtm = gmtime( &unixtime );
- time = mktime(xtm);
- if(xtm->tm_isdst > 0) time-=3600;
- DOSFS_UnixTimeToFileTime( 2*unixtime-time, localft, remainder );
-#endif
- return TRUE;
-}
-
-
/***********************************************************************
* FileTimeToSystemTime (KERNEL32.@)
*/
--- ../cleanwine/dlls/kernel/time.c 2002-11-25 08:58:04.000000000 +0200
+++ dlls/kernel/time.c 2002-11-29 09:04:03.000000000 +0200
@@ -470,3 +470,29 @@
Locale, Calendar, CalType, debugstr_w(lpCalData));
return 0;
}
+
+/*********************************************************************
+ * LocalFileTimeToFileTime (KERNEL32.@)
+ */
+BOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft,
+ LPFILETIME utcft )
+{
+ NTSTATUS status;
+ if ((status = RtlLocalTimeToSystemTime((PLARGE_INTEGER)localft,
+ (PLARGE_INTEGER)utcft)))
+ SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
+
+/*********************************************************************
+ * FileTimeToLocalFileTime (KERNEL32.@)
+ */
+BOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft,
+ LPFILETIME localft )
+{
+ NTSTATUS status;
+ if ((status = RtlSystemTimeToLocalTime((PLARGE_INTEGER)utcft,
+ (PLARGE_INTEGER)localft)))
+ SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
--- ../cleanwine/dlls/ntdll/time.c 2002-11-28 19:30:35.000000000 +0200
+++ dlls/ntdll/time.c 2002-11-29 09:07:29.000000000 +0200
@@ -414,6 +414,32 @@
}
/************ end of code by Rex Jolliff (rex at lvcablemodem.com) ***************/
+/******************************************************************************
+ * RtlLocalTimeToSystemTime [NTDLL.@]
+ *
+ * Converts local time to system time.
+ *
+ * PARAMS:
+ * LocalTime [I]: Localtime to convert.
+ * SystemTime [O]: SystemTime of the supplied localtime.
+ *
+ * RETURNS:
+ * Status.
+ */
+NTSTATUS WINAPI RtlLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
+ PLARGE_INTEGER SystemTime)
+{
+ TIME_ZONE_INFORMATION tzinfo;
+
+ TRACE("(%p, %p)\n", LocalTime, SystemTime);
+
+ RtlQueryTimeZoneInformation(&tzinfo);
+
+ *(LONGLONG *)SystemTime = RtlLargeIntegerAdd(*(LONGLONG *)LocalTime,
+ tzinfo.Bias * 60 * 10000000);
+
+ return STATUS_SUCCESS;
+}
/******************************************************************************
* RtlSystemTimeToLocalTime [NTDLL.@]
@@ -427,13 +453,19 @@
* RETURNS:
* Nothing.
*/
-VOID WINAPI RtlSystemTimeToLocalTime(
+NTSTATUS WINAPI RtlSystemTimeToLocalTime(
IN PLARGE_INTEGER SystemTime,
OUT PLARGE_INTEGER LocalTime)
{
- FIXME("(%p, %p),stub!\n",SystemTime,LocalTime);
+ TIME_ZONE_INFORMATION tzinfo;
+
+ TRACE("(%p, %p)\n", SystemTime, LocalTime);
- memcpy (LocalTime, SystemTime, sizeof (PLARGE_INTEGER));
+ RtlQueryTimeZoneInformation(&tzinfo);
+
+ *(LONGLONG *)LocalTime = RtlLargeIntegerSubtract(*(LONGLONG *)SystemTime,
+ tzinfo.Bias * 60 * 10000000);
+ return STATUS_SUCCESS;
}
/******************************************************************************
--- ../cleanwine/dlls/ntdll/ntdll.spec 2002-11-28 19:30:35.000000000 +0200
+++ dlls/ntdll/ntdll.spec 2002-11-29 10:03:32.000000000 +0200
@@ -450,7 +450,7 @@
@ stdcall RtlLengthRequiredSid(long) RtlLengthRequiredSid
@ stdcall RtlLengthSecurityDescriptor(ptr) RtlLengthSecurityDescriptor
@ stdcall RtlLengthSid(ptr) RtlLengthSid
-@ stub RtlLocalTimeToSystemTime
+@ stdcall RtlLocalTimeToSystemTime(long long) RtlLocalTimeToSystemTime
@ stdcall RtlLockHeap(long) RtlLockHeap
@ stub RtlLookupElementGenericTable
@ stdcall RtlMakeSelfRelativeSD(ptr ptr ptr) RtlMakeSelfRelativeSD
More information about the wine-patches
mailing list