ExpRefreshTimeZoneInformation
INT64 __fastcall ExpRefreshTimeZoneInformation(){
char v0;
BOOL v1;
char v2;
_EJOB *v3;
CHAR v4;
_EJOB *a5;
INT64 v6;
__int64 v7;
INT64 v8;
INT64 v9;
int v10;
__int64 v11;
UINT8 v12;
CHAR v13;
INT64 v14;
INT64 result;
bool SiloTimeZoneMarker;
_RTL_DYNAMIC_TIME_ZONE_INFORMATION *p_Buf2;
_OWORD *v18;
__int64 v19;
__int128 v20;
LONGLONG v21;
union _LARGE_INTEGER v22;
unsigned int Bias;
UINT8 v24;
union _LARGE_INTEGER v25;
union _LARGE_INTEGER v26;
int v27;
UINT64 *v28;
int StandardBias;
_RTL_DYNAMIC_TIME_ZONE_INFORMATION *v30;
_OWORD *v31;
__int128 v32;
__int128 v33;
__int16 Year;
LONGLONG v35;
INT64 v36;
__int16 v37;
char v38;
UINT64 v39;
union _LARGE_INTEGER LocalTime;
CHAR v41[8];
union _LARGE_INTEGER Time;
LARGE_INTEGER v43;
INT64 a3;
__int64 v45;
__int64 v46;
HANDLE Handle;
union _LARGE_INTEGER SystemTime;
union _LARGE_INTEGER v49;
INT64 a4;
struct _TIME_FIELDS TimeFields;
UINT64 v52;
_RTL_DYNAMIC_TIME_ZONE_INFORMATION Buf2;
__int16 KeyName[264];
v2 = v0;
memset((INT64)&Buf2, 0i64);
LOBYTE(v1) = 0;
SystemTime.QuadPart = 0i64;
v49.QuadPart = 0i64;
v3 = 0i64;
v43.QuadPart = 0i64;
v4 = 1;
v46 = 0i64;
TimeFields = 0i64;
*(_DWORD *)v41 = v1;
a5 = PsGetCurrentServerSilo();
v7 = PsGetServerSiloGlobals((__int64)a5)[133];
if( *(_QWORD *)(v7 + 592) )
{
v4 = 0;
}
else
{
ExpInitializeTimeChangeWorker(v7 + 448, ExpTimeZoneDpcRoutine, a5, v6, (INT64)a5);
ExpInitializeTimeChangeWorker(v7 + 768, ExpNextYearDpcRoutine, a5, v8, (INT64)a5);
ExpInitializeTimeChangeWorker(v7 + 608, ExpCenturyDpcRoutine, a5, v9, (INT64)a5);
*(_OWORD *)(v7 + 944) = 0i64;
*(_OWORD *)(v7 + 968) = 0i64;
*(_DWORD *)(v7 + 946) = 65537;
*(_WORD *)(v7 + 956) = 1;
*(_DWORD *)(v7 + 970) = 65537;
*(_WORD *)(v7 + 980) = 1;
}
v10 = 0;
v11 = 3i64;
if( v2 )
{
if( !ExpReadSiloTimeZoneMarker() )
v3 = PsAttachSiloToCurrentThread(0i64);
v10 = RtlQueryDynamicTimeZoneInformation(&Buf2);
if( v3 )
PsDetachSiloFromCurrentThread(v3);
}
else if( PsIsCurrentThreadInServerSilo()
&& (SiloTimeZoneMarker = ExpReadSiloTimeZoneMarker(), p_Buf2 = &Buf2, !SiloTimeZoneMarker) )
{
v18 = (_OWORD *)v7;
v19 = 3i64;
do
{
*(_OWORD *)&p_Buf2->tzi.Bias = *v18;
*(_OWORD *)&p_Buf2->tzi.StandardName[6] = v18[1];
*(_OWORD *)&p_Buf2->tzi.StandardName[14] = v18[2];
*(_OWORD *)&p_Buf2->tzi.StandardName[22] = v18[3];
*(_OWORD *)&p_Buf2->tzi.StandardName[30] = v18[4];
*(_OWORD *)&p_Buf2->tzi.StandardStart.Milliseconds = v18[5];
*(_OWORD *)&p_Buf2->tzi.DaylightName[4] = v18[6];
p_Buf2 = (_RTL_DYNAMIC_TIME_ZONE_INFORMATION *)((char *)p_Buf2 + 128);
v20 = v18[7];
v18 += 8;
*(_OWORD *)&p_Buf2[-1].TimeZoneKeyName[122] = v20;
--v19;
}
while( v19 );
*(_OWORD *)&p_Buf2->tzi.Bias = *v18;
*(_OWORD *)&p_Buf2->tzi.StandardName[6] = v18[1];
*(_OWORD *)&p_Buf2->tzi.StandardName[14] = v18[2];
}
else
{
v10 = RtlQueryDynamicTimeZoneInformation(&Buf2);
}
if( v10 < 0 )
{
++*(_DWORD *)(v7 + 1000);
ExpSystemIsInCmosMode = 1;
ExpLogRefreshTimeZoneInformationQueryFail((unsigned int)v10, v4);
v13 = 0;
v14 = 1i64;
LABEL_11:
EtwTraceTimeZoneInformationRefresh(v14, *(unsigned int *)(v7 + 436), *(unsigned int *)(v7 + 432), v13, v4);
LOBYTE(result) = 0;
return result;
}
v21 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
v22.QuadPart = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - *(_QWORD *)(v7 + 440);
Time = v22;
if( !Buf2.DynamicDaylightTimeDisabled )
{
if( Buf2.TimeZoneKeyName[0] )
{
RtlTimeToTimeFields(&Time, &TimeFields);
if( RtlpCheckDynamicTimeZoneInformation(&Buf2, TimeFields.Year) )
{
LOBYTE(v1) = 1;
*(_DWORD *)v41 = 1;
LABEL_28:
RtlpSetTimeZoneInformationWorker(&Buf2, 0x1B0ui64);
goto LABEL_29;
}
}
}
if( v4 )
{
LODWORD(v39) = 520;
if( (int)RtlGetPersistedStateLocation(
(WCHAR *)L"TimeZoneInformationSettings",
L"TargetNtPath",
0i64,
0i64,
KeyName,
v39,
&v52) >= 0 )
{
Handle = 0i64;
v1 = RtlpGetRegistryHandle(0i64, (const WCHAR *)KeyName, 0, &Handle) == -1073741772;
*(_DWORD *)v41 = v1;
if( Handle )
ZwClose(Handle);
if( v1 )
goto LABEL_28;
}
}
LABEL_29:
Bias = Buf2.tzi.Bias;
a3 = -1i64;
a4 = -1i64;
LODWORD(v45) = Buf2.tzi.Bias;
if( !Buf2.tzi.StandardStart.Month || !Buf2.tzi.DaylightStart.Month )
{
KeCancelTimer((PKTIMER)(v7 + 512));
v28 = (UINT64 *)(v7 + 432);
*(_DWORD *)(v7 + 432) = 0;
v26.QuadPart = 0i64;
LocalTime.QuadPart = 0i64;
goto LABEL_52;
}
if( !RtlCutoverTimeToSystemTime(&Buf2.tzi.StandardStart, &SystemTime, &Time, v12) )
{
LODWORD(v11) = 2;
LABEL_33:
++*(_DWORD *)(v7 + 1000);
ExpSystemIsInCmosMode = 1;
ExpLogRefreshTimeZoneInformationCutoverFail((INT64)&Buf2, v4, &a3, v11);
v13 = v1;
v14 = (unsigned int)v11;
goto LABEL_11;
}
v25 = SystemTime;
a3 = SystemTime.QuadPart;
if( !RtlCutoverTimeToSystemTime(&Buf2.tzi.DaylightStart, &v49, &Time, v24) )
goto LABEL_33;
a4 = v49.QuadPart;
if( v22.QuadPart >= v49.QuadPart && v22.QuadPart >= v25.QuadPart )
{
LocalTime.QuadPart = 0i64;
v26.QuadPart = 0i64;
v27 = (v25.QuadPart <= v49.QuadPart) + 1;
LABEL_43:
v28 = (UINT64 *)(v7 + 432);
*(_DWORD *)(v7 + 432) = v27;
goto LABEL_48;
}
if( v49.QuadPart < v25.QuadPart )
{
if( v22.QuadPart < v49.QuadPart || v22.QuadPart >= v25.QuadPart )
{
v26 = v49;
LocalTime = v49;
v27 = 1;
}
else
{
v26 = v25;
v27 = 2;
LocalTime = v25;
}
goto LABEL_43;
}
if( v22.QuadPart >= v25.QuadPart && v22.QuadPart < v49.QuadPart )
{
v26 = v49;
LocalTime = v49;
v28 = (UINT64 *)(v7 + 432);
*(_DWORD *)(v7 + 432) = 1;
LABEL_49:
StandardBias = Buf2.tzi.StandardBias;
goto LABEL_50;
}
v26 = v25;
v28 = (UINT64 *)(v7 + 432);
LocalTime = v25;
v27 = 2;
*(_DWORD *)(v7 + 432) = 2;
LABEL_48:
StandardBias = Buf2.tzi.DaylightBias;
if( v27 != 2 )
goto LABEL_49;
LABEL_50:
v11 = 3i64;
Bias = StandardBias + v45;
LABEL_52:
if( *(_DWORD *)(v7 + 436) != Bias )
{
v46 = 0xFFFFFFFF00000000ui64;
ZwUpdateWnfStateData();
EtwTraceTimeZoneBiasChange(Bias, *(unsigned int *)(v7 + 436));
}
*(_DWORD *)(v7 + 436) = Bias;
v30 = &Buf2;
*(_QWORD *)(v7 + 440) = 10000000i64 * (int)(60 * Bias);
v31 = (_OWORD *)v7;
do
{
*v31 = *(_OWORD *)&v30->tzi.Bias;
v31[1] = *(_OWORD *)&v30->tzi.StandardName[6];
v31[2] = *(_OWORD *)&v30->tzi.StandardName[14];
v31[3] = *(_OWORD *)&v30->tzi.StandardName[22];
v31[4] = *(_OWORD *)&v30->tzi.StandardName[30];
v31[5] = *(_OWORD *)&v30->tzi.StandardStart.Milliseconds;
v31[6] = *(_OWORD *)&v30->tzi.DaylightName[4];
v31 += 8;
v32 = *(_OWORD *)&v30->tzi.DaylightName[12];
v30 = (_RTL_DYNAMIC_TIME_ZONE_INFORMATION *)((char *)v30 + 128);
*(v31 - 1) = v32;
--v11;
}
while( v11 );
v33 = *(_OWORD *)&v30->tzi.Bias;
ExpSystemIsInCmosMode = 0;
*v31 = v33;
v31[1] = *(_OWORD *)&v30->tzi.StandardName[6];
v31[2] = *(_OWORD *)&v30->tzi.StandardName[14];
RtlSetSystemGlobalData((INT64)v30, v28);
RtlTimeToTimeFields(&Time, &TimeFields);
if( v26.QuadPart )
{
ExLocalTimeToSystemTime(&LocalTime, (PLARGE_INTEGER)(v7 + 992));
KiSetTimerEx((_KTIMER *)(v7 + 512), *(_LARGE_INTEGER *)(v7 + 992), 0i64, 0, (_KDPC *)(v7 + 448));
}
Year = TimeFields.Year;
*(_WORD *)(v7 + 944) = 100 * (TimeFields.Year / 100 + 1);
RtlTimeFieldsToTime((TIME_FIELDS *)(v7 + 944), &v43);
ExLocalTimeToSystemTime(&v43, (PLARGE_INTEGER)(v7 + 936));
KiSetTimerEx((_KTIMER *)(v7 + 672), *(_LARGE_INTEGER *)(v7 + 936), 0i64, 0, (_KDPC *)(v7 + 608));
*(_WORD *)(v7 + 968) = Year + 1;
RtlTimeFieldsToTime((TIME_FIELDS *)(v7 + 968), &v43);
ExLocalTimeToSystemTime(&v43, (PLARGE_INTEGER)(v7 + 960));
KiSetTimerEx((_KTIMER *)(v7 + 832), *(_LARGE_INTEGER *)(v7 + 960), 0i64, 0, (_KDPC *)(v7 + 768));
_InterlockedAdd(&KUSER_SHARED_DATA.TimeZoneBiasStamp, 1u);
ExpWriteTimeZoneBias((UINT64 *)(v7 + 440));
if( LocalTime.QuadPart )
v35 = *(_QWORD *)(v7 + 992);
else
v35 = *(_QWORD *)(v7 + 960) - 10000i64;
ExpWriteTimeZoneBiasStartEnd(v21, v35);
_InterlockedAdd(&KUSER_SHARED_DATA.TimeZoneBiasStamp, 1u);
if( !ExpRealTimeIsUniversal )
RtlSetActiveTimeBias(*(unsigned int *)(v7 + 436));
v37 = TimeFields.Year;
if( TimeFields.Year != *(_WORD *)(v7 + 984) )
{
RtlpUpdateDynamicTimeZones((VOID *)(unsigned __int16)TimeFields.Year, v36);
if( v38 )
*(_WORD *)(v7 + 984) = v37;
}
ExpLogRefreshTimeZoneInformationSuccess((INT64)&Buf2, v4, &a3, &a4, (INT64 *)&LocalTime);
EtwTraceTimeZoneInformationRefresh(0i64, *(unsigned int *)(v7 + 436), *(unsigned int *)v28, v41[0], v4);
LOBYTE(result) = 1;
return result;
}Referenced by:
ExpReadLeapSecondData
ExpRefreshSystemTime
ExpSetSystemTime
ExpTimeZoneInitSiloState
NtSetSystemTime
Phase1InitializationDiscard