RtlCutoverTimeToSystemTime
BOOL __fastcall RtlCutoverTimeToSystemTime(
_TIME_FIELDS *CutoverTime,
_LARGE_INTEGER *SystemTime,
_LARGE_INTEGER *CurrentSystemTime,
UINT8 ThisYear){
__int16 Day;
__int16 Month;
__int16 Weekday;
__int16 v9;
__int16 Milliseconds;
INT64 v11;
__int16 v12;
__int16 v13;
INT64 v14;
_TIME_FIELDS TimeFields;
_TIME_FIELDS v17;
_LARGE_INTEGER Time;
TimeFields = 0i64;
RtlTimeToTimeFields((INT64 *)CurrentSystemTime, (WORD *)&TimeFields, (INT64)CurrentSystemTime);
if( !CutoverTime->Year )
{
Day = CutoverTime->Day;
Time.QuadPart = 0i64;
v17 = 0i64;
if( Day <= 5 )
{
if( Day )
{
Month = CutoverTime->Month;
Weekday = CutoverTime->Weekday;
v9 = 1;
TimeFields.Hour = CutoverTime->Hour;
TimeFields.Minute = CutoverTime->Minute;
TimeFields.Second = CutoverTime->Second;
Milliseconds = CutoverTime->Milliseconds;
TimeFields.Month = Month;
TimeFields.Milliseconds = Milliseconds;
TimeFields.Day = 1;
TimeFields.Weekday = 0;
if( RtlTimeFieldsToTime(&TimeFields, &Time) )
{
RtlTimeToTimeFields((INT64 *)&Time, (WORD *)&v17, v11);
if( v17.Weekday <= Weekday )
{
v12 = 1;
if( v17.Weekday >= Weekday )
{
LABEL_8:
v13 = 1;
if( Day > 1 )
{
do
{
v9 += 7;
TimeFields.Day = v9;
if( !RtlTimeFieldsToTime(&TimeFields, &Time) )
break;
RtlTimeToTimeFields((INT64 *)&Time, (WORD *)&v17, v14);
v12 = v17.Day;
++v13;
}
while( v13 < Day );
}
TimeFields.Day = v12;
if( RtlTimeFieldsToTime(&TimeFields, &Time) )
{
*SystemTime = Time;
return 1;
}
return 0;
}
v9 = Weekday - v17.Weekday + 1;
}
else
{
v9 = Weekday - v17.Weekday + 8;
}
v12 = v9;
goto LABEL_8;
}
}
}
return 0;
}
return RtlTimeFieldsToTime(CutoverTime, SystemTime) != 0;
}Referenced by:
ExInitializeUtcTimeZoneBias
ExpRefreshTimeZoneInformation