ExpSetTimeZoneInformation

INT64 __fastcall ExpSetTimeZoneInformation(VOID *SystemInformation, UINT64 SystemInformationLength){
  int v2; 
  bool SiloTimeZoneMarker; 
  __int64 v5; 
  char *v6; 
  _RTL_DYNAMIC_TIME_ZONE_INFORMATION *p_ValueData; 
  __int64 v8; 
  _OWORD *v9; 
  _RTL_DYNAMIC_TIME_ZONE_INFORMATION *p_DynamicTimeZoneInformation; 
  INT64 result; 
  int v12; 
  _RTL_DYNAMIC_TIME_ZONE_INFORMATION ValueData; 
  _RTL_DYNAMIC_TIME_ZONE_INFORMATION DynamicTimeZoneInformation; 
  v2 = SystemInformationLength;
  memset((INT64)&ValueData, 0i64);
  SiloTimeZoneMarker = 0;
  if( v2 == 172 )
  {
    v5 = 3i64;
    if( ((unsigned __int8)SystemInformation & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)SystemInformation + 172 > 0x7FFFFFFF0000i64
      || (char *)SystemInformation + 172 < SystemInformation )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
    *(_OWORD *)&ValueData.tzi.Bias = *(_OWORD *)SystemInformation;
    *(_OWORD *)&ValueData.tzi.StandardName[6] = *((_OWORD *)SystemInformation + 1);
    *(_OWORD *)&ValueData.tzi.StandardName[14] = *((_OWORD *)SystemInformation + 2);
    *(_OWORD *)&ValueData.tzi.StandardName[22] = *((_OWORD *)SystemInformation + 3);
    *(_OWORD *)&ValueData.tzi.StandardName[30] = *((_OWORD *)SystemInformation + 4);
    *(_OWORD *)&ValueData.tzi.StandardStart.Milliseconds = *((_OWORD *)SystemInformation + 5);
    *(_OWORD *)&ValueData.tzi.DaylightName[4] = *((_OWORD *)SystemInformation + 6);
    *(_OWORD *)&ValueData.tzi.DaylightName[12] = *((_OWORD *)SystemInformation + 7);
    v6 = (char *)SystemInformation + 128;
    *(_OWORD *)&ValueData.tzi.DaylightName[20] = *(_OWORD *)v6;
    *(_OWORD *)&ValueData.tzi.DaylightName[28] = *((_OWORD *)v6 + 1);
    *(_QWORD *)&ValueData.tzi.DaylightStart.Minute = *((_QWORD *)v6 + 4);
    ValueData.tzi.DaylightBias = *((_DWORD *)v6 + 10);
    memset((INT64)ValueData.TimeZoneKeyName, 0i64);
    ValueData.DynamicDaylightTimeDisabled = 1;
  }
  else
  {
    if( v2 != 432 )
      return 3221225476i64;
    v5 = 3i64;
    if( ((unsigned __int8)SystemInformation & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)SystemInformation + 432 > 0x7FFFFFFF0000i64
      || (char *)SystemInformation + 432 < SystemInformation )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
    p_ValueData = &ValueData;
    v8 = 3i64;
    do
    {
      *(_OWORD *)&p_ValueData->tzi.Bias = *(_OWORD *)SystemInformation;
      *(_OWORD *)&p_ValueData->tzi.StandardName[6] = *((_OWORD *)SystemInformation + 1);
      *(_OWORD *)&p_ValueData->tzi.StandardName[14] = *((_OWORD *)SystemInformation + 2);
      *(_OWORD *)&p_ValueData->tzi.StandardName[22] = *((_OWORD *)SystemInformation + 3);
      *(_OWORD *)&p_ValueData->tzi.StandardName[30] = *((_OWORD *)SystemInformation + 4);
      *(_OWORD *)&p_ValueData->tzi.StandardStart.Milliseconds = *((_OWORD *)SystemInformation + 5);
      *(_OWORD *)&p_ValueData->tzi.DaylightName[4] = *((_OWORD *)SystemInformation + 6);
      p_ValueData = (_RTL_DYNAMIC_TIME_ZONE_INFORMATION *)((char *)p_ValueData + 128);
      *(_OWORD *)&p_ValueData[-1].TimeZoneKeyName[122] = *((_OWORD *)SystemInformation + 7);
      SystemInformation = (char *)SystemInformation + 128;
      --v8;
    }
    while( v8 );
    *(_OWORD *)&p_ValueData->tzi.Bias = *(_OWORD *)SystemInformation;
    *(_OWORD *)&p_ValueData->tzi.StandardName[6] = *((_OWORD *)SystemInformation + 1);
    *(_OWORD *)&p_ValueData->tzi.StandardName[14] = *((_OWORD *)SystemInformation + 2);
  }
  ExAcquireTimeRefreshLock(1u);
  v9 = (_OWORD *)PsGetCurrentServerSiloGlobals()[133];
  p_DynamicTimeZoneInformation = &DynamicTimeZoneInformation;
  do
  {
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.Bias = *v9;
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[6] = v9[1];
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[14] = v9[2];
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[22] = v9[3];
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[30] = v9[4];
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardStart.Milliseconds = v9[5];
    *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.DaylightName[4] = v9[6];
    p_DynamicTimeZoneInformation = (_RTL_DYNAMIC_TIME_ZONE_INFORMATION *)((char *)p_DynamicTimeZoneInformation + 128);
    *(_OWORD *)&p_DynamicTimeZoneInformation[-1].TimeZoneKeyName[122] = v9[7];
    v9 += 8;
    --v5;
  }
  while( v5 );
  *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.Bias = *v9;
  *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[6] = v9[1];
  *(_OWORD *)&p_DynamicTimeZoneInformation->tzi.StandardName[14] = v9[2];
  ExReleaseResourceLite(&ExpTimeRefreshLock);
  KeLeaveCriticalRegion();
  if( !PsIsCurrentThreadInServerSilo()
    || (SiloTimeZoneMarker = ExpReadSiloTimeZoneMarker())
    || (LODWORD(result) = ExpWriteSiloTimeZoneMarker(1u), (int)result >= 0) )
  {
    v12 = RtlpSetTimeZoneInformationWorker(&ValueData, 0x1B0ui64);
    if( v12 >= 0 )
      v12 = NtSetSystemTime(0i64, 0i64);
    if( v12 < 0 )
    {
      RtlpSetTimeZoneInformationWorker(&DynamicTimeZoneInformation, 0x1B0ui64);
      if( PsIsCurrentThreadInServerSilo() )
      {
        if( !SiloTimeZoneMarker )
          ExpWriteSiloTimeZoneMarker(0);
      }
    }
    return(unsigned int)v12;
  }
  return result;
}

Referenced by:

NtSetSystemInformation