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