private static TimeZoneInfo FromRegistryKey (string id, RegistryKey key)
{
byte [] reg_tzi = (byte []) key.GetValue ("TZI");
if (reg_tzi == null)
throw new InvalidTimeZoneException ();
int bias = BitConverter.ToInt32 (reg_tzi, 0);
TimeSpan baseUtcOffset = new TimeSpan (0, -bias, 0);
string display_name = (string) key.GetValue ("Display");
string standard_name = (string) key.GetValue ("Std");
string daylight_name = (string) key.GetValue ("Dlt");
List<AdjustmentRule> adjustmentRules = new List<AdjustmentRule> ();
RegistryKey dst_key = key.OpenSubKey ("Dynamic DST", false);
if (dst_key != null) {
int first_year = (int) dst_key.GetValue ("FirstEntry");
int last_year = (int) dst_key.GetValue ("LastEntry");
int year;
for (year=first_year; year<=last_year; year++) {
byte [] dst_tzi = (byte []) dst_key.GetValue (year.ToString ());
if (dst_tzi != null) {
int start_year = year == first_year ? 1 : year;
int end_year = year == last_year ? 9999 : year;
ParseRegTzi(adjustmentRules, start_year, end_year, dst_tzi);
}
}
}
else
ParseRegTzi(adjustmentRules, 1, 9999, reg_tzi);
return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules).ToArray ());
}