ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

time.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.