Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: dll/win32/kernel32/client/time.c * PURPOSE: Time conversion functions * PROGRAMMER: Ariadne * DOSDATE and DOSTIME structures from Onno Hovers * UPDATE HISTORY: * Created 19/01/99 */
/* INCLUDES *******************************************************************/
#include <k32.h>
#define NDEBUG#include <debug.h>
/* FUNCTIONS ******************************************************************/
/* * @implemented */BOOLWINAPIIsTimeZoneRedirectionEnabled(VOID){ /* Return if a TS Timezone ID is active */ return (BaseStaticServerData->TermsrvClientTimeZoneId != TIME_ZONE_ID_INVALID);}
/* * @implemented */BOOLWINAPIFileTimeToDosDateTime(IN CONST FILETIME *lpFileTime, OUT LPWORD lpFatDate, OUT LPWORD lpFatTime){ LARGE_INTEGER FileTime; TIME_FIELDS TimeFields;
FileTime.HighPart = lpFileTime->dwHighDateTime; FileTime.LowPart = lpFileTime->dwLowDateTime;
if (FileTime.QuadPart < 0) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; }
RtlTimeToTimeFields(&FileTime, &TimeFields); if ((TimeFields.Year < 1980) || (TimeFields.Year > 2107)) { BaseSetLastNTError(STATUS_INVALID_PARAMETER); return FALSE; }
*lpFatDate = (TimeFields.Day) | (TimeFields.Month << 5) | ((TimeFields.Year - 1980) << 9); *lpFatTime = (TimeFields.Second >> 1) | (TimeFields.Minute << 5) | (TimeFields.Hour << 11);
return TRUE;}
/* * @implemented */BOOLWINAPIDosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime){ TIME_FIELDS TimeFields; LARGE_INTEGER SystemTime;
TimeFields.Year = (wFatDate >> 9) + 1980; TimeFields.Month = (wFatDate >> 5) & 0xF; TimeFields.Day = (wFatDate & 0x1F); TimeFields.Hour = (wFatTime >> 11); TimeFields.Minute = (wFatTime >> 5) & 0x3F; TimeFields.Second = (wFatTime & 0x1F) << 1; TimeFields.Milliseconds = 0;
if (RtlTimeFieldsToTime(&TimeFields, &SystemTime)) { lpFileTime->dwLowDateTime = SystemTime.LowPart; lpFileTime->dwHighDateTime = SystemTime.HighPart; return TRUE; }
BaseSetLastNTError(STATUS_INVALID_PARAMETER); return FALSE;}
/* * @implemented */LONGWINAPICompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2){ LARGE_INTEGER Time1, Time2, Diff;
Time1.LowPart = lpFileTime1->dwLowDateTime; Time2.LowPart = lpFileTime2->dwLowDateTime; Time1.HighPart = lpFileTime1->dwHighDateTime; Time2.HighPart = lpFileTime2->dwHighDateTime;
Diff.QuadPart = Time1.QuadPart - Time2.QuadPart;
if (Diff.HighPart < 0) return -1; if (Diff.QuadPart == 0) return 0; return 1;}
/* * @implemented */VOIDWINAPIGetSystemTimeAsFileTime(OUT PFILETIME lpFileTime){ LARGE_INTEGER SystemTime;
do { SystemTime.HighPart = SharedUserData->SystemTime.High1Time; SystemTime.LowPart = SharedUserData->SystemTime.LowPart; } while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time);
lpFileTime->dwLowDateTime = SystemTime.LowPart; lpFileTime->dwHighDateTime = SystemTime.HighPart;}
/* * @unimplemented */VOIDWINAPIGetSystemTimePreciseAsFileTime(OUT PFILETIME lpFileTime){ STUB;}
/* * @implemented */BOOLWINAPISystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime){ TIME_FIELDS TimeFields; LARGE_INTEGER liTime;
TimeFields.Year = lpSystemTime->wYear; TimeFields.Month = lpSystemTime->wMonth; TimeFields.Day = lpSystemTime->wDay; TimeFields.Hour = lpSystemTime->wHour; TimeFields.Minute = lpSystemTime->wMinute; TimeFields.Second = lpSystemTime->wSecond; TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
if (RtlTimeFieldsToTime(&TimeFields, &liTime)) { lpFileTime->dwLowDateTime = liTime.u.LowPart; lpFileTime->dwHighDateTime = liTime.u.HighPart; return TRUE; }
BaseSetLastNTError(STATUS_INVALID_PARAMETER); return FALSE;}
/* * @implemented */BOOLWINAPIFileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime){ TIME_FIELDS TimeFields; LARGE_INTEGER liTime;
liTime.u.LowPart = lpFileTime->dwLowDateTime; liTime.u.HighPart = lpFileTime->dwHighDateTime; if (liTime.QuadPart < 0) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; }
RtlTimeToTimeFields(&liTime, &TimeFields);
lpSystemTime->wYear = TimeFields.Year; lpSystemTime->wMonth = TimeFields.Month; lpSystemTime->wDay = TimeFields.Day; lpSystemTime->wHour = TimeFields.Hour; lpSystemTime->wMinute = TimeFields.Minute; lpSystemTime->wSecond = TimeFields.Second; lpSystemTime->wMilliseconds = TimeFields.Milliseconds; lpSystemTime->wDayOfWeek = TimeFields.Weekday;
return TRUE;}
/* * @implemented */BOOLWINAPIFileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime){ LARGE_INTEGER TimeZoneBias, FileTime; volatile KSYSTEM_TIME *TimePtr;
TimePtr = IsTimeZoneRedirectionEnabled() ? &BaseStaticServerData->ktTermsrvClientBias : &SharedUserData->TimeZoneBias; do { TimeZoneBias.HighPart = TimePtr->High1Time; TimeZoneBias.LowPart = TimePtr->LowPart; } while (TimeZoneBias.HighPart != TimePtr->High2Time);
FileTime.LowPart = lpFileTime->dwLowDateTime; FileTime.HighPart = lpFileTime->dwHighDateTime;
FileTime.QuadPart -= TimeZoneBias.QuadPart;
lpLocalFileTime->dwLowDateTime = FileTime.LowPart; lpLocalFileTime->dwHighDateTime = FileTime.HighPart;
return TRUE;}
/* * @implemented */BOOLWINAPILocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, OUT LPFILETIME lpFileTime){ LARGE_INTEGER TimeZoneBias, FileTime; volatile KSYSTEM_TIME *TimePtr;
TimePtr = IsTimeZoneRedirectionEnabled() ? &BaseStaticServerData->ktTermsrvClientBias : &SharedUserData->TimeZoneBias;
do { TimeZoneBias.HighPart = TimePtr->High1Time; TimeZoneBias.LowPart = TimePtr->LowPart; } while (TimeZoneBias.HighPart != TimePtr->High2Time);
FileTime.LowPart = lpLocalFileTime->dwLowDateTime; FileTime.HighPart = lpLocalFileTime->dwHighDateTime;
FileTime.QuadPart += TimeZoneBias.QuadPart;
lpFileTime->dwLowDateTime = FileTime.LowPart; lpFileTime->dwHighDateTime = FileTime.HighPart;
return TRUE;}
/* * @implemented */VOIDWINAPIGetLocalTime(OUT LPSYSTEMTIME lpSystemTime){ LARGE_INTEGER SystemTime, TimeZoneBias; TIME_FIELDS TimeFields; volatile KSYSTEM_TIME *TimePtr;
do { SystemTime.HighPart = SharedUserData->SystemTime.High1Time; SystemTime.LowPart = SharedUserData->SystemTime.LowPart; } while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time);
TimePtr = IsTimeZoneRedirectionEnabled() ? &BaseStaticServerData->ktTermsrvClientBias : &SharedUserData->TimeZoneBias; do { TimeZoneBias.HighPart = TimePtr->High1Time; TimeZoneBias.LowPart = TimePtr->LowPart; } while (TimeZoneBias.HighPart != TimePtr->High2Time);
SystemTime.QuadPart -= TimeZoneBias.QuadPart; RtlTimeToTimeFields(&SystemTime, &TimeFields);
lpSystemTime->wYear = TimeFields.Year; lpSystemTime->wMonth = TimeFields.Month; lpSystemTime->wDay = TimeFields.Day; lpSystemTime->wHour = TimeFields.Hour; lpSystemTime->wMinute = TimeFields.Minute; lpSystemTime->wSecond = TimeFields.Second; lpSystemTime->wMilliseconds = TimeFields.Milliseconds; lpSystemTime->wDayOfWeek = TimeFields.Weekday;}
/* * @implemented */VOIDWINAPIGetSystemTime(OUT LPSYSTEMTIME lpSystemTime){ LARGE_INTEGER SystemTime; TIME_FIELDS TimeFields;
do { SystemTime.HighPart = SharedUserData->SystemTime.High1Time; SystemTime.LowPart = SharedUserData->SystemTime.LowPart; } while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time);
RtlTimeToTimeFields(&SystemTime, &TimeFields);
lpSystemTime->wYear = TimeFields.Year; lpSystemTime->wMonth = TimeFields.Month; lpSystemTime->wDay = TimeFields.Day; lpSystemTime->wHour = TimeFields.Hour; lpSystemTime->wMinute = TimeFields.Minute; lpSystemTime->wSecond = TimeFields.Second; lpSystemTime->wMilliseconds = TimeFields.Milliseconds; lpSystemTime->wDayOfWeek = TimeFields.Weekday;}
/* * @implemented */BOOLWINAPISetLocalTime(IN CONST SYSTEMTIME *lpSystemTime){ LARGE_INTEGER NewSystemTime, TimeZoneBias; NTSTATUS Status; ULONG Privilege = SE_SYSTEMTIME_PRIVILEGE; TIME_FIELDS TimeFields; PVOID State; volatile KSYSTEM_TIME *TimePtr;
TimePtr = IsTimeZoneRedirectionEnabled() ? &BaseStaticServerData->ktTermsrvClientBias : &SharedUserData->TimeZoneBias; do { TimeZoneBias.HighPart = TimePtr->High1Time; TimeZoneBias.LowPart = TimePtr->LowPart; } while (TimeZoneBias.HighPart != TimePtr->High2Time);
TimeFields.Year = lpSystemTime->wYear; TimeFields.Month = lpSystemTime->wMonth; TimeFields.Day = lpSystemTime->wDay; TimeFields.Hour = lpSystemTime->wHour; TimeFields.Minute = lpSystemTime->wMinute; TimeFields.Second = lpSystemTime->wSecond; TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
if (!RtlTimeFieldsToTime(&TimeFields, &NewSystemTime)) { BaseSetLastNTError(STATUS_INVALID_PARAMETER); return FALSE; }
NewSystemTime.QuadPart += TimeZoneBias.QuadPart;
Status = RtlAcquirePrivilege(&Privilege, 1, 0, &State); if (NT_SUCCESS(Status)) { Status = NtSetSystemTime(&NewSystemTime, NULL); RtlReleasePrivilege(State); }
if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; }
return TRUE;}
/* * @implemented */BOOLWINAPISetSystemTime(IN CONST SYSTEMTIME *lpSystemTime){ LARGE_INTEGER NewSystemTime; NTSTATUS Status; ULONG Privilege = SE_SYSTEMTIME_PRIVILEGE; TIME_FIELDS TimeFields; PVOID State;
TimeFields.Year = lpSystemTime->wYear; TimeFields.Month = lpSystemTime->wMonth; TimeFields.Day = lpSystemTime->wDay; TimeFields.Hour = lpSystemTime->wHour; TimeFields.Minute = lpSystemTime->wMinute; TimeFields.Second = lpSystemTime->wSecond; TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
if (!RtlTimeFieldsToTime(&TimeFields, &NewSystemTime)) { BaseSetLastNTError(STATUS_INVALID_PARAMETER); return FALSE; }
Status = RtlAcquirePrivilege(&Privilege, 1, 0, &State); if (NT_SUCCESS(Status)) { Status = NtSetSystemTime(&NewSystemTime, NULL); RtlReleasePrivilege(State); }
if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; }
return TRUE;}
/* * @implemented */DWORDWINAPIGetTickCount(VOID){ ULARGE_INTEGER TickCount;
#ifdef _WIN64 TickCount.QuadPart = *((volatile ULONG64*)&SharedUserData->TickCount);#else while (TRUE) { TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time; TickCount.LowPart = SharedUserData->TickCount.LowPart;
if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time) break;
YieldProcessor(); }#endif
return (ULONG)((UInt32x32To64(TickCount.LowPart, SharedUserData->TickCountMultiplier) >> 24) + UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF, SharedUserData->TickCountMultiplier));
}
/* * @implemented */BOOLWINAPIGetSystemTimeAdjustment(OUT PDWORD lpTimeAdjustment, OUT PDWORD lpTimeIncrement, OUT PBOOL lpTimeAdjustmentDisabled){ SYSTEM_QUERY_TIME_ADJUST_INFORMATION TimeInfo; NTSTATUS Status;
Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation, &TimeInfo, sizeof(TimeInfo), NULL); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; }
*lpTimeAdjustment = (DWORD)TimeInfo.TimeAdjustment; *lpTimeIncrement = (DWORD)TimeInfo.TimeIncrement; *lpTimeAdjustmentDisabled = (BOOL)TimeInfo.Enable;
return TRUE;}
/* * @implemented */BOOLWINAPISetSystemTimeAdjustment(IN DWORD dwTimeAdjustment, IN BOOL bTimeAdjustmentDisabled){ NTSTATUS Status; SYSTEM_SET_TIME_ADJUST_INFORMATION TimeInfo;
TimeInfo.TimeAdjustment = (ULONG)dwTimeAdjustment; TimeInfo.Enable = (BOOLEAN)bTimeAdjustmentDisabled;
Status = NtSetSystemInformation(SystemTimeAdjustmentInformation, &TimeInfo, sizeof(TimeInfo)); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; }
return TRUE;}
/* * @implemented */BOOLWINAPIGetSystemTimes(OUT LPFILETIME lpIdleTime OPTIONAL, OUT LPFILETIME lpKernelTime OPTIONAL, OUT LPFILETIME lpUserTime OPTIONAL){ PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION ProcPerfInfo; LARGE_INTEGER TotalUserTime, TotalKernTime, TotalIdleTime; ULONG BufferSize, ReturnLength; CCHAR i; NTSTATUS Status;
TotalUserTime.QuadPart = TotalKernTime.QuadPart = TotalIdleTime.QuadPart = 0;
BufferSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * BaseStaticServerData->SysInfo.NumberOfProcessors;
ProcPerfInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize); if (!ProcPerfInfo) { BaseSetLastNTError(STATUS_NO_MEMORY); return FALSE; }
Status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, ProcPerfInfo, BufferSize, &ReturnLength); if ((NT_SUCCESS(Status)) && (ReturnLength == BufferSize)) { if (lpIdleTime) { for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) { TotalIdleTime.QuadPart += ProcPerfInfo[i].IdleTime.QuadPart; }
lpIdleTime->dwLowDateTime = TotalIdleTime.LowPart; lpIdleTime->dwHighDateTime = TotalIdleTime.HighPart; }
if (lpKernelTime) { for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) { TotalKernTime.QuadPart += ProcPerfInfo[i].KernelTime.QuadPart; }
lpKernelTime->dwLowDateTime = TotalKernTime.LowPart; lpKernelTime->dwHighDateTime = TotalKernTime.HighPart; }
if (lpUserTime) { for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) { TotalUserTime.QuadPart += ProcPerfInfo[i].UserTime.QuadPart; }
lpUserTime->dwLowDateTime = TotalUserTime.LowPart; lpUserTime->dwHighDateTime = TotalUserTime.HighPart; } } else if (NT_SUCCESS(Status)) { Status = STATUS_INTERNAL_ERROR; }
RtlFreeHeap(RtlGetProcessHeap(), 0, ProcPerfInfo); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; }
return TRUE;}
/* * @unimplemented */BOOLWINAPISetClientTimeZoneInformation(IN CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation){ STUB; return 0;}
/* EOF */