ExInitializeUtcTimeZoneBias

INT64 __fastcall ExInitializeUtcTimeZoneBias(LARGE_INTEGER *SystemTime){
  INT64 v2; 
  __int64 v3; 
  int v4; 
  int v5; 
  UINT8 v6; 
  UINT8 v7; 
  union _LARGE_INTEGER v8; 
  union _LARGE_INTEGER v9; 
  int v10; 
  int v11; 
  union _LARGE_INTEGER v12; 
  int v13; 
  LONGLONG QuadPart; 
  union _LARGE_INTEGER v15; 
  union _LARGE_INTEGER SystemTimea; 
  union _LARGE_INTEGER v17; 
  int v18; 
  int v19; 
  union _LARGE_INTEGER v20; 
  _QWORD TimeFields[3]; 
  _RTL_DYNAMIC_TIME_ZONE_INFORMATION result; 
  v15.QuadPart = 0i64;
  SystemTimea.QuadPart = 0i64;
  memset((INT64)&result, 0i64);
  *(_OWORD *)&TimeFields[1] = 0i64;
  if( !ExpRealTimeIsUniversal )
    return 3221225659i64;
  v3 = PsGetCurrentServerSiloGlobals()[133];
  v2 = RtlQueryDynamicTimeZoneInformation(&result);
  if( (int)v2 >= 0 )
  {
    v4 = result.tzi.Bias + result.tzi.DaylightBias;
    v5 = result.tzi.Bias + result.tzi.StandardBias;
    RtlTimeToTimeFields(SystemTime, (PTIME_FIELDS)&TimeFields[1]);
    if( result.tzi.StandardStart.Month
      && result.tzi.DaylightStart.Month
      && RtlCutoverTimeToSystemTime(&result.tzi.StandardStart, &SystemTimea, SystemTime, v6)
      && RtlCutoverTimeToSystemTime(&result.tzi.DaylightStart, &v15, SystemTime, v7) )
    {
      v8.QuadPart = v15.QuadPart + 600000000i64 * v5;
      v15 = v8;
      v9.QuadPart = SystemTimea.QuadPart + 600000000i64 * v4;
      SystemTimea = v9;
      if( v8.QuadPart >= v9.QuadPart )
      {
        v17 = v9;
        v10 = 1;
        v19 = 1;
        v11 = v5;
        LODWORD(TimeFields[0]) = v4;
        v12 = v9;
        v20 = v8;
        v5 = v4;
        v9 = v8;
        v13 = 2;
      }
      else
      {
        LODWORD(TimeFields[0]) = v5;
        v10 = 2;
        v19 = 2;
        v11 = v4;
        v17 = v8;
        v12 = v8;
        v20 = v9;
        v13 = 1;
      }
      QuadPart = SystemTime->QuadPart;
      HIDWORD(TimeFields[0]) = v13;
      v18 = v11;
      if( QuadPart < v12.QuadPart || QuadPart >= v9.QuadPart )
      {
        *(_DWORD *)(v3 + 432) = v13;
        v11 = v5;
        *(_DWORD *)(v3 + 436) = v5;
      }
      else
      {
        *(_DWORD *)(v3 + 432) = v10;
        *(_DWORD *)(v3 + 436) = v11;
      }
      *(_QWORD *)(v3 + 440) = 600000000i64 * v11;
      KUSER_SHARED_DATA.TimeZoneBiasStamp = 0;
      ExpWriteTimeZoneBias((UINT64 *)(v3 + 440));
      return 0i64;
    }
    else
    {
      return 3221225473i64;
    }
  }
  return v2;
}

Referenced by:

Phase1InitializationDiscard