1 /* $Id: time.c,v 1.30 2004/07/30 19:18:39 jimtabor Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/time.c
6 * PURPOSE: Time conversion functions
7 * PROGRAMMER: Boudewijn ( ariadne@xs4all.nl)
8 * DOSDATE and DOSTIME structures from Onno Hovers
13 /* INCLUDES ******************************************************************/
18 #include "../include/debug.h"
20 /* TYPES *********************************************************************/
22 typedef struct __DOSTIME
29 typedef struct __DOSDATE
36 #define TICKSPERMIN 600000000
38 /* FUNCTIONS ****************************************************************/
45 FileTimeToDosDateTime(
46 CONST FILETIME
*lpFileTime
,
51 PDOSTIME pdtime
=(PDOSTIME
) lpFatTime
;
52 PDOSDATE pddate
=(PDOSDATE
) lpFatDate
;
53 SYSTEMTIME SystemTime
;
55 if ( lpFileTime
== NULL
)
58 if ( lpFatDate
== NULL
)
61 if ( lpFatTime
== NULL
)
69 pdtime
->Second
= SystemTime
.wSecond
/ 2;
70 pdtime
->Minute
= SystemTime
.wMinute
;
71 pdtime
->Hour
= SystemTime
.wHour
;
73 pddate
->Day
= SystemTime
.wDay
;
74 pddate
->Month
= SystemTime
.wMonth
;
75 pddate
->Year
= SystemTime
.wYear
- 1980;
86 DosDateTimeToFileTime(
92 PDOSTIME pdtime
= (PDOSTIME
) &wFatTime
;
93 PDOSDATE pddate
= (PDOSDATE
) &wFatDate
;
94 SYSTEMTIME SystemTime
;
96 if ( lpFileTime
== NULL
)
99 SystemTime
.wMilliseconds
= 0;
100 SystemTime
.wSecond
= pdtime
->Second
* 2;
101 SystemTime
.wMinute
= pdtime
->Minute
;
102 SystemTime
.wHour
= pdtime
->Hour
;
104 SystemTime
.wDay
= pddate
->Day
;
105 SystemTime
.wMonth
= pddate
->Month
;
106 SystemTime
.wYear
= 1980 + pddate
->Year
;
108 SystemTimeToFileTime(&SystemTime
,lpFileTime
);
120 CONST FILETIME
*lpFileTime1
,
121 CONST FILETIME
*lpFileTime2
124 if ( lpFileTime1
== NULL
)
126 if ( lpFileTime2
== NULL
)
129 if (*((PLONGLONG
)lpFileTime1
) > *((PLONGLONG
)lpFileTime2
))
131 else if (*((PLONGLONG
)lpFileTime1
) < *((PLONGLONG
)lpFileTime2
))
142 GetSystemTimeAsFileTime (PFILETIME lpFileTime
)
144 NtQuerySystemTime ((PLARGE_INTEGER
)lpFileTime
);
153 SystemTimeToFileTime(
154 CONST SYSTEMTIME
* lpSystemTime
,
155 LPFILETIME lpFileTime
159 TIME_FIELDS TimeFields
;
160 LARGE_INTEGER liTime
;
162 TimeFields
.Year
= lpSystemTime
->wYear
;
163 TimeFields
.Month
= lpSystemTime
->wMonth
;
164 TimeFields
.Day
= lpSystemTime
->wDay
;
165 TimeFields
.Hour
= lpSystemTime
->wHour
;
166 TimeFields
.Minute
= lpSystemTime
->wMinute
;
167 TimeFields
.Second
= lpSystemTime
->wSecond
;
168 TimeFields
.Milliseconds
= lpSystemTime
->wMilliseconds
;
170 if (RtlTimeFieldsToTime (&TimeFields
, &liTime
))
172 lpFileTime
->dwLowDateTime
= liTime
.u
.LowPart
;
173 lpFileTime
->dwHighDateTime
= liTime
.u
.HighPart
;
185 FileTimeToSystemTime(
186 CONST FILETIME
*lpFileTime
,
187 LPSYSTEMTIME lpSystemTime
190 TIME_FIELDS TimeFields
;
191 LARGE_INTEGER liTime
;
193 if(lpFileTime
->dwHighDateTime
& 0x80000000)
196 liTime
.u
.LowPart
= lpFileTime
->dwLowDateTime
;
197 liTime
.u
.HighPart
= lpFileTime
->dwHighDateTime
;
199 RtlTimeToTimeFields(&liTime
, &TimeFields
);
201 lpSystemTime
->wYear
= TimeFields
.Year
;
202 lpSystemTime
->wMonth
= TimeFields
.Month
;
203 lpSystemTime
->wDay
= TimeFields
.Day
;
204 lpSystemTime
->wHour
= TimeFields
.Hour
;
205 lpSystemTime
->wMinute
= TimeFields
.Minute
;
206 lpSystemTime
->wSecond
= TimeFields
.Second
;
207 lpSystemTime
->wMilliseconds
= TimeFields
.Milliseconds
;
208 lpSystemTime
->wDayOfWeek
= TimeFields
.Weekday
;
219 FileTimeToLocalFileTime(
220 CONST FILETIME
*lpFileTime
,
221 LPFILETIME lpLocalFileTime
224 // FIXME: include time bias
225 *((PLONGLONG
)lpLocalFileTime
) = *((PLONGLONG
)lpFileTime
);
236 LocalFileTimeToFileTime(
237 CONST FILETIME
*lpLocalFileTime
,
238 LPFILETIME lpFileTime
241 // FIXME: include time bias
242 *((PLONGLONG
)lpFileTime
) = *((PLONGLONG
)lpLocalFileTime
);
252 GetLocalTime(LPSYSTEMTIME lpSystemTime
)
255 FILETIME LocalFileTime
;
257 NtQuerySystemTime ((PLARGE_INTEGER
)&FileTime
);
258 FileTimeToLocalFileTime (&FileTime
, &LocalFileTime
);
259 FileTimeToSystemTime (&LocalFileTime
, lpSystemTime
);
267 GetSystemTime(LPSYSTEMTIME lpSystemTime
)
271 NtQuerySystemTime ((PLARGE_INTEGER
)&FileTime
);
272 FileTimeToSystemTime (&FileTime
, lpSystemTime
);
280 SetLocalTime(CONST SYSTEMTIME
*lpSystemTime
)
282 FILETIME LocalFileTime
;
283 LARGE_INTEGER FileTime
;
286 SystemTimeToFileTime (lpSystemTime
, &LocalFileTime
);
287 LocalFileTimeToFileTime (&LocalFileTime
, (FILETIME
*)&FileTime
);
288 errCode
= NtSetSystemTime (&FileTime
, &FileTime
);
289 if (!NT_SUCCESS(errCode
))
299 SetSystemTime(CONST SYSTEMTIME
*lpSystemTime
)
301 LARGE_INTEGER NewSystemTime
;
304 SystemTimeToFileTime (lpSystemTime
, (PFILETIME
)&NewSystemTime
);
305 errCode
= NtSetSystemTime (&NewSystemTime
, &NewSystemTime
);
306 if (!NT_SUCCESS(errCode
))
316 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation
)
318 TIME_ZONE_INFORMATION TimeZoneInformation
;
321 DPRINT("GetTimeZoneInformation()\n");
323 Status
= NtQuerySystemInformation(SystemCurrentTimeZoneInformation
,
324 &TimeZoneInformation
,
325 sizeof(TIME_ZONE_INFORMATION
),
327 if (!NT_SUCCESS(Status
))
329 SetLastErrorByStatus(Status
);
330 return TIME_ZONE_ID_INVALID
;
333 memcpy(lpTimeZoneInformation
,
334 &TimeZoneInformation
,
335 sizeof(TIME_ZONE_INFORMATION
));
337 return(SharedUserData
->TimeZoneId
);
345 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION
*lpTimeZoneInformation
)
347 TIME_ZONE_INFORMATION TimeZoneInformation
;
350 DPRINT("SetTimeZoneInformation()\n");
352 memcpy(&TimeZoneInformation
,
353 lpTimeZoneInformation
,
354 sizeof(TIME_ZONE_INFORMATION
));
356 Status
= RtlSetTimeZoneInformation(&TimeZoneInformation
);
357 if (!NT_SUCCESS(Status
))
359 SetLastErrorByStatus(Status
);
363 NtSetSystemTime(0,0);
375 return (DWORD
)((ULONGLONG
)SharedUserData
->TickCountLow
* SharedUserData
->TickCountMultiplier
/ 16777216);
383 SystemTimeToTzSpecificLocalTime(
384 LPTIME_ZONE_INFORMATION lpTimeZoneInformation
,
385 LPSYSTEMTIME lpUniversalTime
,
386 LPSYSTEMTIME lpLocalTime
389 TIME_ZONE_INFORMATION TimeZoneInformation
;
390 LPTIME_ZONE_INFORMATION lpTzInfo
;
391 LARGE_INTEGER FileTime
;
393 if (!lpTimeZoneInformation
)
395 GetTimeZoneInformation (&TimeZoneInformation
);
396 lpTzInfo
= &TimeZoneInformation
;
399 lpTzInfo
= lpTimeZoneInformation
;
401 if (!lpUniversalTime
)
407 SystemTimeToFileTime (lpUniversalTime
, (PFILETIME
)&FileTime
);
408 FileTime
.QuadPart
-= (lpTzInfo
->Bias
* TICKSPERMIN
);
409 FileTimeToSystemTime ((PFILETIME
)&FileTime
, lpLocalTime
);
419 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment
,
420 PDWORD lpTimeIncrement
,
421 PBOOL lpTimeAdjustmentDisabled
)
423 SYSTEM_QUERY_TIME_ADJUSTMENT Buffer
;
426 Status
= NtQuerySystemInformation(SystemTimeAdjustmentInformation
,
428 sizeof(SYSTEM_QUERY_TIME_ADJUSTMENT
),
430 if (!NT_SUCCESS(Status
))
432 SetLastErrorByStatus(Status
);
436 *lpTimeAdjustment
= (DWORD
)Buffer
.TimeAdjustment
;
437 *lpTimeIncrement
= (DWORD
)Buffer
.MaximumIncrement
;
438 *lpTimeAdjustmentDisabled
= (BOOL
)Buffer
.TimeSynchronization
;
448 SetSystemTimeAdjustment(DWORD dwTimeAdjustment
,
449 BOOL bTimeAdjustmentDisabled
)
452 SYSTEM_SET_TIME_ADJUSTMENT Buffer
;
454 Buffer
.TimeAdjustment
= (ULONG
)dwTimeAdjustment
;
455 Buffer
.TimeSynchronization
= (BOOLEAN
)bTimeAdjustmentDisabled
;
457 Status
= NtSetSystemInformation(SystemTimeAdjustmentInformation
,
459 sizeof(SYSTEM_SET_TIME_ADJUSTMENT
));
460 if (!NT_SUCCESS(Status
))
462 SetLastErrorByStatus(Status
);
476 LPFILETIME lpIdleTime
,
477 LPFILETIME lpKernelTime
,
478 LPFILETIME lpUserTime
481 SYSTEM_PROCESSORTIME_INFO SysProcTime
;
484 Status
= ZwQuerySystemInformation(SystemProcessorPerformanceInformation
,
489 if (!NT_SUCCESS(Status
))
491 SetLastErrorByStatus(Status
);
495 Good only for one processor system.
498 lpIdleTime
->dwLowDateTime
= SysProcTime
.TotalProcessorRunTime
.LowPart
;
499 lpIdleTime
->dwHighDateTime
= SysProcTime
.TotalProcessorRunTime
.HighPart
;
501 lpKernelTime
->dwLowDateTime
= SysProcTime
.TotalProcessorTime
.LowPart
;
502 lpKernelTime
->dwHighDateTime
= SysProcTime
.TotalProcessorTime
.HighPart
;
504 lpUserTime
->dwLowDateTime
= SysProcTime
.TotalProcessorUserTime
.LowPart
;
505 lpUserTime
->dwHighDateTime
= SysProcTime
.TotalProcessorUserTime
.HighPart
;