Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentime.c
Go to the documentation of this file.
00001 /* $Id: time.c 52770 2011-07-22 02:13:57Z ion $ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS system libraries 00005 * FILE: lib/kernel32/misc/time.c 00006 * PURPOSE: Time conversion functions 00007 * PROGRAMMER: Ariadne 00008 * DOSDATE and DOSTIME structures from Onno Hovers 00009 * UPDATE HISTORY: 00010 * Created 19/01/99 00011 */ 00012 00013 /* INCLUDES *******************************************************************/ 00014 00015 #include <k32.h> 00016 00017 #define NDEBUG 00018 #include <debug.h> 00019 00020 /* FUNCTIONS ******************************************************************/ 00021 00022 /* 00023 * @implemented 00024 */ 00025 BOOL 00026 WINAPI 00027 IsTimeZoneRedirectionEnabled(VOID) 00028 { 00029 /* Return if a TS Timezone ID is active */ 00030 return (BaseStaticServerData->TermsrvClientTimeZoneId != TIME_ZONE_ID_INVALID); 00031 } 00032 00033 /* 00034 * @implemented 00035 */ 00036 BOOL 00037 WINAPI 00038 FileTimeToDosDateTime(IN CONST FILETIME *lpFileTime, 00039 OUT LPWORD lpFatDate, 00040 OUT LPWORD lpFatTime) 00041 { 00042 LARGE_INTEGER FileTime; 00043 TIME_FIELDS TimeFields; 00044 00045 FileTime.HighPart = lpFileTime->dwHighDateTime; 00046 FileTime.LowPart = lpFileTime->dwLowDateTime; 00047 00048 if (FileTime.QuadPart < 0) 00049 { 00050 SetLastError(ERROR_INVALID_PARAMETER); 00051 return FALSE; 00052 } 00053 00054 RtlTimeToTimeFields(&FileTime, &TimeFields); 00055 if ((TimeFields.Year < 1980) || (TimeFields.Year > 2107)) 00056 { 00057 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00058 return FALSE; 00059 } 00060 00061 *lpFatDate = (TimeFields.Day) | 00062 (TimeFields.Month << 5) | 00063 ((TimeFields.Year - 1980) << 9); 00064 *lpFatTime = (TimeFields.Second >> 1) | 00065 (TimeFields.Minute << 5) | 00066 (TimeFields.Hour << 16); 00067 00068 return TRUE; 00069 } 00070 00071 /* 00072 * @implemented 00073 */ 00074 BOOL 00075 WINAPI 00076 DosDateTimeToFileTime(IN WORD wFatDate, 00077 IN WORD wFatTime, 00078 OUT LPFILETIME lpFileTime) 00079 { 00080 TIME_FIELDS TimeFields; 00081 LARGE_INTEGER SystemTime; 00082 00083 TimeFields.Year = (wFatDate >> 9) + 1980; 00084 TimeFields.Month = (wFatDate >> 5) & 0xF; 00085 TimeFields.Day = (wFatDate & 0x1F); 00086 TimeFields.Hour = (wFatTime >> 11); 00087 TimeFields.Minute = (wFatTime >> 5) & 0x3F; 00088 TimeFields.Second = (wFatTime & 0x1F) << 1; 00089 TimeFields.Milliseconds = 0; 00090 00091 if (RtlTimeFieldsToTime(&TimeFields, &SystemTime)) 00092 { 00093 lpFileTime->dwLowDateTime = SystemTime.LowPart; 00094 lpFileTime->dwHighDateTime = SystemTime.HighPart; 00095 return TRUE; 00096 } 00097 00098 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00099 return FALSE; 00100 } 00101 00102 /* 00103 * @implemented 00104 */ 00105 LONG 00106 WINAPI 00107 CompareFileTime(IN CONST FILETIME *lpFileTime1, 00108 IN CONST FILETIME *lpFileTime2) 00109 { 00110 LARGE_INTEGER Time1, Time2, Diff; 00111 00112 Time1.LowPart = lpFileTime1->dwLowDateTime; 00113 Time2.LowPart = lpFileTime2->dwLowDateTime; 00114 Time1.HighPart = lpFileTime1->dwHighDateTime; 00115 Time2.HighPart = lpFileTime2->dwHighDateTime; 00116 00117 Diff.QuadPart = Time1.QuadPart - Time2.QuadPart; 00118 00119 if (Diff.HighPart < 0) return -1; 00120 if (Diff.QuadPart == 0) return 0; 00121 return 1; 00122 } 00123 00124 /* 00125 * @implemented 00126 */ 00127 VOID 00128 WINAPI 00129 GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime) 00130 { 00131 LARGE_INTEGER SystemTime; 00132 00133 do 00134 { 00135 SystemTime.HighPart = SharedUserData->SystemTime.High1Time; 00136 SystemTime.LowPart = SharedUserData->SystemTime.LowPart; 00137 } 00138 while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time); 00139 00140 lpFileTime->dwLowDateTime = SystemTime.LowPart; 00141 lpFileTime->dwHighDateTime = SystemTime.HighPart; 00142 } 00143 00144 /* 00145 * @implemented 00146 */ 00147 BOOL 00148 WINAPI 00149 SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, 00150 OUT LPFILETIME lpFileTime) 00151 { 00152 TIME_FIELDS TimeFields; 00153 LARGE_INTEGER liTime; 00154 00155 TimeFields.Year = lpSystemTime->wYear; 00156 TimeFields.Month = lpSystemTime->wMonth; 00157 TimeFields.Day = lpSystemTime->wDay; 00158 TimeFields.Hour = lpSystemTime->wHour; 00159 TimeFields.Minute = lpSystemTime->wMinute; 00160 TimeFields.Second = lpSystemTime->wSecond; 00161 TimeFields.Milliseconds = lpSystemTime->wMilliseconds; 00162 00163 if (RtlTimeFieldsToTime(&TimeFields, &liTime)) 00164 { 00165 lpFileTime->dwLowDateTime = liTime.u.LowPart; 00166 lpFileTime->dwHighDateTime = liTime.u.HighPart; 00167 return TRUE; 00168 } 00169 00170 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00171 return FALSE; 00172 } 00173 00174 /* 00175 * @implemented 00176 */ 00177 BOOL 00178 WINAPI 00179 FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, 00180 OUT LPSYSTEMTIME lpSystemTime) 00181 { 00182 TIME_FIELDS TimeFields; 00183 LARGE_INTEGER liTime; 00184 00185 liTime.u.LowPart = lpFileTime->dwLowDateTime; 00186 liTime.u.HighPart = lpFileTime->dwHighDateTime; 00187 if (liTime.QuadPart < 0) 00188 { 00189 SetLastError(ERROR_INVALID_PARAMETER); 00190 return FALSE; 00191 } 00192 00193 RtlTimeToTimeFields(&liTime, &TimeFields); 00194 00195 lpSystemTime->wYear = TimeFields.Year; 00196 lpSystemTime->wMonth = TimeFields.Month; 00197 lpSystemTime->wDay = TimeFields.Day; 00198 lpSystemTime->wHour = TimeFields.Hour; 00199 lpSystemTime->wMinute = TimeFields.Minute; 00200 lpSystemTime->wSecond = TimeFields.Second; 00201 lpSystemTime->wMilliseconds = TimeFields.Milliseconds; 00202 lpSystemTime->wDayOfWeek = TimeFields.Weekday; 00203 00204 return TRUE; 00205 } 00206 00207 /* 00208 * @implemented 00209 */ 00210 BOOL 00211 WINAPI 00212 FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, 00213 OUT LPFILETIME lpLocalFileTime) 00214 { 00215 LARGE_INTEGER TimeZoneBias, FileTime; 00216 volatile KSYSTEM_TIME *TimePtr; 00217 00218 TimePtr = IsTimeZoneRedirectionEnabled() ? 00219 &BaseStaticServerData->ktTermsrvClientBias : 00220 &SharedUserData->TimeZoneBias; 00221 do 00222 { 00223 TimeZoneBias.HighPart = TimePtr->High1Time; 00224 TimeZoneBias.LowPart = TimePtr->LowPart; 00225 } 00226 while (TimeZoneBias.HighPart != TimePtr->High2Time); 00227 00228 FileTime.LowPart = lpFileTime->dwLowDateTime; 00229 FileTime.HighPart = lpFileTime->dwHighDateTime; 00230 00231 FileTime.QuadPart -= TimeZoneBias.QuadPart; 00232 00233 lpLocalFileTime->dwLowDateTime = FileTime.LowPart; 00234 lpLocalFileTime->dwHighDateTime = FileTime.HighPart; 00235 00236 return TRUE; 00237 } 00238 00239 /* 00240 * @implemented 00241 */ 00242 BOOL 00243 WINAPI 00244 LocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, 00245 OUT LPFILETIME lpFileTime) 00246 { 00247 LARGE_INTEGER TimeZoneBias, FileTime; 00248 volatile KSYSTEM_TIME *TimePtr; 00249 00250 TimePtr = IsTimeZoneRedirectionEnabled() ? 00251 &BaseStaticServerData->ktTermsrvClientBias : 00252 &SharedUserData->TimeZoneBias; 00253 00254 do 00255 { 00256 TimeZoneBias.HighPart = TimePtr->High1Time; 00257 TimeZoneBias.LowPart = TimePtr->LowPart; 00258 } 00259 while (TimeZoneBias.HighPart != TimePtr->High2Time); 00260 00261 FileTime.LowPart = lpLocalFileTime->dwLowDateTime; 00262 FileTime.HighPart = lpLocalFileTime->dwHighDateTime; 00263 00264 FileTime.QuadPart += TimeZoneBias.QuadPart; 00265 00266 lpFileTime->dwLowDateTime = FileTime.LowPart; 00267 lpFileTime->dwHighDateTime = FileTime.HighPart; 00268 00269 return TRUE; 00270 } 00271 00272 /* 00273 * @implemented 00274 */ 00275 VOID 00276 WINAPI 00277 GetLocalTime(OUT LPSYSTEMTIME lpSystemTime) 00278 { 00279 LARGE_INTEGER SystemTime, TimeZoneBias; 00280 TIME_FIELDS TimeFields; 00281 volatile KSYSTEM_TIME *TimePtr; 00282 00283 do 00284 { 00285 SystemTime.HighPart = SharedUserData->SystemTime.High1Time; 00286 SystemTime.LowPart = SharedUserData->SystemTime.LowPart; 00287 } 00288 while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time); 00289 00290 TimePtr = IsTimeZoneRedirectionEnabled() ? 00291 &BaseStaticServerData->ktTermsrvClientBias : 00292 &SharedUserData->TimeZoneBias; 00293 do 00294 { 00295 TimeZoneBias.HighPart = TimePtr->High1Time; 00296 TimeZoneBias.LowPart = TimePtr->LowPart; 00297 } 00298 while (TimeZoneBias.HighPart != TimePtr->High2Time); 00299 00300 SystemTime.QuadPart -= TimeZoneBias.QuadPart; 00301 RtlTimeToTimeFields(&SystemTime, &TimeFields); 00302 00303 lpSystemTime->wYear = TimeFields.Year; 00304 lpSystemTime->wMonth = TimeFields.Month; 00305 lpSystemTime->wDay = TimeFields.Day; 00306 lpSystemTime->wHour = TimeFields.Hour; 00307 lpSystemTime->wMinute = TimeFields.Minute; 00308 lpSystemTime->wSecond = TimeFields.Second; 00309 lpSystemTime->wMilliseconds = TimeFields.Milliseconds; 00310 lpSystemTime->wDayOfWeek = TimeFields.Weekday; 00311 } 00312 00313 /* 00314 * @implemented 00315 */ 00316 VOID 00317 WINAPI 00318 GetSystemTime(OUT LPSYSTEMTIME lpSystemTime) 00319 { 00320 LARGE_INTEGER SystemTime; 00321 TIME_FIELDS TimeFields; 00322 00323 do 00324 { 00325 SystemTime.HighPart = SharedUserData->SystemTime.High1Time; 00326 SystemTime.LowPart = SharedUserData->SystemTime.LowPart; 00327 } 00328 while (SystemTime.HighPart != SharedUserData->SystemTime.High2Time); 00329 00330 RtlTimeToTimeFields(&SystemTime, &TimeFields); 00331 00332 lpSystemTime->wYear = TimeFields.Year; 00333 lpSystemTime->wMonth = TimeFields.Month; 00334 lpSystemTime->wDay = TimeFields.Day; 00335 lpSystemTime->wHour = TimeFields.Hour; 00336 lpSystemTime->wMinute = TimeFields.Minute; 00337 lpSystemTime->wSecond = TimeFields.Second; 00338 lpSystemTime->wMilliseconds = TimeFields.Milliseconds; 00339 lpSystemTime->wDayOfWeek = TimeFields.Weekday; 00340 } 00341 00342 /* 00343 * @implemented 00344 */ 00345 BOOL 00346 WINAPI 00347 SetLocalTime(IN CONST SYSTEMTIME *lpSystemTime) 00348 { 00349 LARGE_INTEGER NewSystemTime, TimeZoneBias; 00350 NTSTATUS Status; 00351 ULONG Privilege = SE_SYSTEMTIME_PRIVILEGE; 00352 TIME_FIELDS TimeFields; 00353 PVOID State; 00354 volatile KSYSTEM_TIME *TimePtr; 00355 00356 TimePtr = IsTimeZoneRedirectionEnabled() ? 00357 &BaseStaticServerData->ktTermsrvClientBias : 00358 &SharedUserData->TimeZoneBias; 00359 do 00360 { 00361 TimeZoneBias.HighPart = TimePtr->High1Time; 00362 TimeZoneBias.LowPart = TimePtr->LowPart; 00363 } 00364 while (TimeZoneBias.HighPart != TimePtr->High2Time); 00365 00366 TimeFields.Year = lpSystemTime->wYear; 00367 TimeFields.Month = lpSystemTime->wMonth; 00368 TimeFields.Day = lpSystemTime->wDay; 00369 TimeFields.Hour = lpSystemTime->wHour; 00370 TimeFields.Minute = lpSystemTime->wMinute; 00371 TimeFields.Second = lpSystemTime->wSecond; 00372 TimeFields.Milliseconds = lpSystemTime->wMilliseconds; 00373 00374 if (!RtlTimeFieldsToTime(&TimeFields, &NewSystemTime)) 00375 { 00376 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00377 return FALSE; 00378 } 00379 00380 NewSystemTime.QuadPart += TimeZoneBias.QuadPart; 00381 00382 Status = RtlAcquirePrivilege(&Privilege, 1, 0, &State); 00383 Status = STATUS_SUCCESS; 00384 if (NT_SUCCESS(Status)) 00385 { 00386 Status = NtSetSystemTime(&NewSystemTime, NULL); 00387 RtlReleasePrivilege(State); 00388 } 00389 00390 if (!NT_SUCCESS(Status)) 00391 { 00392 BaseSetLastNTError(Status); 00393 return FALSE; 00394 } 00395 00396 return TRUE; 00397 } 00398 00399 /* 00400 * @implemented 00401 */ 00402 BOOL 00403 WINAPI 00404 SetSystemTime(IN CONST SYSTEMTIME *lpSystemTime) 00405 { 00406 LARGE_INTEGER NewSystemTime; 00407 NTSTATUS Status; 00408 ULONG Privilege = SE_SYSTEMTIME_PRIVILEGE; 00409 TIME_FIELDS TimeFields; 00410 PVOID State; 00411 00412 TimeFields.Year = lpSystemTime->wYear; 00413 TimeFields.Month = lpSystemTime->wMonth; 00414 TimeFields.Day = lpSystemTime->wDay; 00415 TimeFields.Hour = lpSystemTime->wHour; 00416 TimeFields.Minute = lpSystemTime->wMinute; 00417 TimeFields.Second = lpSystemTime->wSecond; 00418 TimeFields.Milliseconds = lpSystemTime->wMilliseconds; 00419 00420 if (!RtlTimeFieldsToTime(&TimeFields, &NewSystemTime)) 00421 { 00422 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00423 return FALSE; 00424 } 00425 00426 Status = RtlAcquirePrivilege(&Privilege, 1, 0, &State); 00427 Status = STATUS_SUCCESS; 00428 if (NT_SUCCESS(Status)) 00429 { 00430 Status = NtSetSystemTime(&NewSystemTime, NULL); 00431 RtlReleasePrivilege(State); 00432 } 00433 00434 if (!NT_SUCCESS(Status)) 00435 { 00436 BaseSetLastNTError(Status); 00437 return FALSE; 00438 } 00439 00440 return TRUE; 00441 } 00442 00443 /* 00444 * @implemented 00445 */ 00446 DWORD 00447 WINAPI 00448 GetTickCount(VOID) 00449 { 00450 ULARGE_INTEGER TickCount; 00451 00452 while (TRUE) 00453 { 00454 TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time; 00455 TickCount.LowPart = SharedUserData->TickCount.LowPart; 00456 00457 if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time) 00458 break; 00459 00460 YieldProcessor(); 00461 } 00462 00463 return (ULONG)((UInt32x32To64(TickCount.LowPart, 00464 SharedUserData->TickCountMultiplier) >> 24) + 00465 UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF, 00466 SharedUserData->TickCountMultiplier)); 00467 00468 } 00469 00470 /* 00471 * @implemented 00472 */ 00473 BOOL 00474 WINAPI 00475 GetSystemTimeAdjustment(OUT PDWORD lpTimeAdjustment, 00476 OUT PDWORD lpTimeIncrement, 00477 OUT PBOOL lpTimeAdjustmentDisabled) 00478 { 00479 SYSTEM_QUERY_TIME_ADJUST_INFORMATION TimeInfo; 00480 NTSTATUS Status; 00481 00482 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation, 00483 &TimeInfo, 00484 sizeof(TimeInfo), 00485 NULL); 00486 if (!NT_SUCCESS(Status)) 00487 { 00488 BaseSetLastNTError(Status); 00489 return FALSE; 00490 } 00491 00492 *lpTimeAdjustment = (DWORD)TimeInfo.TimeAdjustment; 00493 *lpTimeIncrement = (DWORD)TimeInfo.TimeIncrement; 00494 *lpTimeAdjustmentDisabled = (BOOL)TimeInfo.Enable; 00495 00496 return TRUE; 00497 } 00498 00499 /* 00500 * @implemented 00501 */ 00502 BOOL 00503 WINAPI 00504 SetSystemTimeAdjustment(IN DWORD dwTimeAdjustment, 00505 IN BOOL bTimeAdjustmentDisabled) 00506 { 00507 NTSTATUS Status; 00508 SYSTEM_SET_TIME_ADJUST_INFORMATION TimeInfo; 00509 00510 TimeInfo.TimeAdjustment = (ULONG)dwTimeAdjustment; 00511 TimeInfo.Enable = (BOOLEAN)bTimeAdjustmentDisabled; 00512 00513 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation, 00514 &TimeInfo, 00515 sizeof(TimeInfo)); 00516 if (!NT_SUCCESS(Status)) 00517 { 00518 BaseSetLastNTError(Status); 00519 return FALSE; 00520 } 00521 00522 return TRUE; 00523 } 00524 00525 /* 00526 * @implemented 00527 */ 00528 BOOL 00529 WINAPI 00530 GetSystemTimes(OUT LPFILETIME lpIdleTime OPTIONAL, 00531 OUT LPFILETIME lpKernelTime OPTIONAL, 00532 OUT LPFILETIME lpUserTime OPTIONAL) 00533 { 00534 PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION ProcPerfInfo; 00535 LARGE_INTEGER TotalUserTime, TotalKernTime, TotalIdleTime; 00536 SIZE_T BufferSize, ReturnLength; 00537 ULONG i; 00538 NTSTATUS Status; 00539 00540 TotalUserTime.QuadPart = TotalKernTime.QuadPart = TotalIdleTime.QuadPart = 0; 00541 00542 BufferSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * 00543 BaseStaticServerData->SysInfo.NumberOfProcessors; 00544 00545 ProcPerfInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize); 00546 if (!ProcPerfInfo) 00547 { 00548 BaseSetLastNTError(STATUS_NO_MEMORY); 00549 return FALSE; 00550 } 00551 00552 Status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, 00553 ProcPerfInfo, 00554 BufferSize, 00555 &ReturnLength); 00556 if ((NT_SUCCESS(Status)) && (ReturnLength == BufferSize)) 00557 { 00558 if (lpIdleTime) 00559 { 00560 for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) 00561 { 00562 TotalIdleTime.QuadPart += ProcPerfInfo[i].IdleTime.QuadPart; 00563 } 00564 00565 lpIdleTime->dwLowDateTime = TotalIdleTime.LowPart; 00566 lpIdleTime->dwHighDateTime = TotalIdleTime.HighPart; 00567 } 00568 00569 if (lpKernelTime) 00570 { 00571 for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) 00572 { 00573 TotalKernTime.QuadPart += ProcPerfInfo[i].KernelTime.QuadPart; 00574 } 00575 00576 lpKernelTime->dwLowDateTime = TotalKernTime.LowPart; 00577 lpKernelTime->dwHighDateTime = TotalKernTime.HighPart; 00578 } 00579 00580 if (lpUserTime) 00581 { 00582 for (i = 0; i < BaseStaticServerData->SysInfo.NumberOfProcessors; i++) 00583 { 00584 TotalUserTime.QuadPart += ProcPerfInfo[i].UserTime.QuadPart; 00585 } 00586 00587 lpUserTime->dwLowDateTime = TotalUserTime.LowPart; 00588 lpUserTime->dwHighDateTime = TotalUserTime.HighPart; 00589 } 00590 } 00591 else if (NT_SUCCESS(Status)) 00592 { 00593 Status = STATUS_INTERNAL_ERROR; 00594 } 00595 00596 RtlFreeHeap(RtlGetProcessHeap(), 0, ProcPerfInfo); 00597 if (!NT_SUCCESS(Status)) 00598 { 00599 BaseSetLastNTError(Status); 00600 return FALSE; 00601 } 00602 00603 return TRUE; 00604 } 00605 00606 /* 00607 * @unimplemented 00608 */ 00609 BOOL 00610 WINAPI 00611 SetClientTimeZoneInformation(IN CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation) 00612 { 00613 STUB; 00614 return 0; 00615 } 00616 00617 /* EOF */ Generated on Sat May 26 2012 04:17:07 for ReactOS by
1.7.6.1
|