From: Paul Gofman <pgofman@codeweavers.com> --- dlls/kernelbase/kernelbase.rgs | 454 +++++++++++++++++++++++++++++++++ dlls/ntdll/unix/system.c | 97 ++++++- tools/make_unicode | 24 +- 3 files changed, 564 insertions(+), 11 deletions(-) diff --git a/dlls/kernelbase/kernelbase.rgs b/dlls/kernelbase/kernelbase.rgs index ac1820d5c79..0a01ee5580f 100644 --- a/dlls/kernelbase/kernelbase.rgs +++ b/dlls/kernelbase/kernelbase.rgs @@ -3255,6 +3255,460 @@ HKLM } } } + NoRemove Wine + { + 'Time Zones' + { + 'TZ Mapping' + { + val 'Africa/Abidjan' = s 'Greenwich Standard Time' + val 'Africa/Accra' = s 'Greenwich Standard Time' + val 'Africa/Addis_Ababa' = s 'E. Africa Standard Time' + val 'Africa/Algiers' = s 'W. Central Africa Standard Time' + val 'Africa/Asmera' = s 'E. Africa Standard Time' + val 'Africa/Bamako' = s 'Greenwich Standard Time' + val 'Africa/Bangui' = s 'W. Central Africa Standard Time' + val 'Africa/Banjul' = s 'Greenwich Standard Time' + val 'Africa/Bissau' = s 'Greenwich Standard Time' + val 'Africa/Blantyre' = s 'South Africa Standard Time' + val 'Africa/Brazzaville' = s 'W. Central Africa Standard Time' + val 'Africa/Bujumbura' = s 'South Africa Standard Time' + val 'Africa/Cairo' = s 'Egypt Standard Time' + val 'Africa/Casablanca' = s 'Morocco Standard Time' + val 'Africa/Ceuta' = s 'Romance Standard Time' + val 'Africa/Conakry' = s 'Greenwich Standard Time' + val 'Africa/Dakar' = s 'Greenwich Standard Time' + val 'Africa/Dar_es_Salaam' = s 'E. Africa Standard Time' + val 'Africa/Djibouti' = s 'E. Africa Standard Time' + val 'Africa/Douala' = s 'W. Central Africa Standard Time' + val 'Africa/El_Aaiun' = s 'Morocco Standard Time' + val 'Africa/Freetown' = s 'Greenwich Standard Time' + val 'Africa/Gaborone' = s 'South Africa Standard Time' + val 'Africa/Harare' = s 'South Africa Standard Time' + val 'Africa/Johannesburg' = s 'South Africa Standard Time' + val 'Africa/Juba' = s 'South Sudan Standard Time' + val 'Africa/Kampala' = s 'E. Africa Standard Time' + val 'Africa/Khartoum' = s 'Sudan Standard Time' + val 'Africa/Kigali' = s 'South Africa Standard Time' + val 'Africa/Kinshasa' = s 'W. Central Africa Standard Time' + val 'Africa/Lagos' = s 'W. Central Africa Standard Time' + val 'Africa/Libreville' = s 'W. Central Africa Standard Time' + val 'Africa/Lome' = s 'Greenwich Standard Time' + val 'Africa/Luanda' = s 'W. Central Africa Standard Time' + val 'Africa/Lubumbashi' = s 'South Africa Standard Time' + val 'Africa/Lusaka' = s 'South Africa Standard Time' + val 'Africa/Malabo' = s 'W. Central Africa Standard Time' + val 'Africa/Maputo' = s 'South Africa Standard Time' + val 'Africa/Maseru' = s 'South Africa Standard Time' + val 'Africa/Mbabane' = s 'South Africa Standard Time' + val 'Africa/Mogadishu' = s 'E. Africa Standard Time' + val 'Africa/Monrovia' = s 'Greenwich Standard Time' + val 'Africa/Nairobi' = s 'E. Africa Standard Time' + val 'Africa/Ndjamena' = s 'W. Central Africa Standard Time' + val 'Africa/Niamey' = s 'W. Central Africa Standard Time' + val 'Africa/Nouakchott' = s 'Greenwich Standard Time' + val 'Africa/Ouagadougou' = s 'Greenwich Standard Time' + val 'Africa/Porto-Novo' = s 'W. Central Africa Standard Time' + val 'Africa/Sao_Tome' = s 'Sao Tome Standard Time' + val 'Africa/Tripoli' = s 'Libya Standard Time' + val 'Africa/Tunis' = s 'W. Central Africa Standard Time' + val 'Africa/Windhoek' = s 'Namibia Standard Time' + val 'America/Adak' = s 'Aleutian Standard Time' + val 'America/Anchorage' = s 'Alaskan Standard Time' + val 'America/Anguilla' = s 'SA Western Standard Time' + val 'America/Antigua' = s 'SA Western Standard Time' + val 'America/Araguaina' = s 'Tocantins Standard Time' + val 'America/Argentina/La_Rioja' = s 'Argentina Standard Time' + val 'America/Argentina/Rio_Gallegos' = s 'Argentina Standard Time' + val 'America/Argentina/Salta' = s 'Argentina Standard Time' + val 'America/Argentina/San_Juan' = s 'Argentina Standard Time' + val 'America/Argentina/San_Luis' = s 'Argentina Standard Time' + val 'America/Argentina/Tucuman' = s 'Argentina Standard Time' + val 'America/Argentina/Ushuaia' = s 'Argentina Standard Time' + val 'America/Aruba' = s 'SA Western Standard Time' + val 'America/Asuncion' = s 'Paraguay Standard Time' + val 'America/Bahia' = s 'Bahia Standard Time' + val 'America/Bahia_Banderas' = s 'Central Standard Time (Mexico)' + val 'America/Barbados' = s 'SA Western Standard Time' + val 'America/Belem' = s 'SA Eastern Standard Time' + val 'America/Belize' = s 'Central America Standard Time' + val 'America/Blanc-Sablon' = s 'SA Western Standard Time' + val 'America/Boa_Vista' = s 'SA Western Standard Time' + val 'America/Bogota' = s 'SA Pacific Standard Time' + val 'America/Boise' = s 'Mountain Standard Time' + val 'America/Buenos_Aires' = s 'Argentina Standard Time' + val 'America/Cambridge_Bay' = s 'Mountain Standard Time' + val 'America/Campo_Grande' = s 'Central Brazilian Standard Time' + val 'America/Cancun' = s 'Eastern Standard Time (Mexico)' + val 'America/Caracas' = s 'Venezuela Standard Time' + val 'America/Catamarca' = s 'Argentina Standard Time' + val 'America/Cayenne' = s 'SA Eastern Standard Time' + val 'America/Cayman' = s 'SA Pacific Standard Time' + val 'America/Chicago' = s 'Central Standard Time' + val 'America/Chihuahua' = s 'Central Standard Time (Mexico)' + val 'America/Ciudad_Juarez' = s 'Mountain Standard Time' + val 'America/Coral_Harbour' = s 'SA Pacific Standard Time' + val 'America/Cordoba' = s 'Argentina Standard Time' + val 'America/Costa_Rica' = s 'Central America Standard Time' + val 'America/Coyhaique' = s 'Magallanes Standard Time' + val 'America/Creston' = s 'US Mountain Standard Time' + val 'America/Cuiaba' = s 'Central Brazilian Standard Time' + val 'America/Curacao' = s 'SA Western Standard Time' + val 'America/Danmarkshavn' = s 'Greenwich Standard Time' + val 'America/Dawson' = s 'Yukon Standard Time' + val 'America/Dawson_Creek' = s 'US Mountain Standard Time' + val 'America/Denver' = s 'Mountain Standard Time' + val 'America/Detroit' = s 'Eastern Standard Time' + val 'America/Dominica' = s 'SA Western Standard Time' + val 'America/Edmonton' = s 'Mountain Standard Time' + val 'America/Eirunepe' = s 'SA Pacific Standard Time' + val 'America/El_Salvador' = s 'Central America Standard Time' + val 'America/Fort_Nelson' = s 'US Mountain Standard Time' + val 'America/Fortaleza' = s 'SA Eastern Standard Time' + val 'America/Glace_Bay' = s 'Atlantic Standard Time' + val 'America/Godthab' = s 'Greenland Standard Time' + val 'America/Goose_Bay' = s 'Atlantic Standard Time' + val 'America/Grand_Turk' = s 'Turks And Caicos Standard Time' + val 'America/Grenada' = s 'SA Western Standard Time' + val 'America/Guadeloupe' = s 'SA Western Standard Time' + val 'America/Guatemala' = s 'Central America Standard Time' + val 'America/Guayaquil' = s 'SA Pacific Standard Time' + val 'America/Guyana' = s 'SA Western Standard Time' + val 'America/Halifax' = s 'Atlantic Standard Time' + val 'America/Havana' = s 'Cuba Standard Time' + val 'America/Hermosillo' = s 'US Mountain Standard Time' + val 'America/Indiana/Knox' = s 'Central Standard Time' + val 'America/Indiana/Marengo' = s 'US Eastern Standard Time' + val 'America/Indiana/Petersburg' = s 'Eastern Standard Time' + val 'America/Indiana/Tell_City' = s 'Central Standard Time' + val 'America/Indiana/Vevay' = s 'US Eastern Standard Time' + val 'America/Indiana/Vincennes' = s 'Eastern Standard Time' + val 'America/Indiana/Winamac' = s 'Eastern Standard Time' + val 'America/Indianapolis' = s 'US Eastern Standard Time' + val 'America/Inuvik' = s 'Mountain Standard Time' + val 'America/Iqaluit' = s 'Eastern Standard Time' + val 'America/Jamaica' = s 'SA Pacific Standard Time' + val 'America/Jujuy' = s 'Argentina Standard Time' + val 'America/Juneau' = s 'Alaskan Standard Time' + val 'America/Kentucky/Monticello' = s 'Eastern Standard Time' + val 'America/Kralendijk' = s 'SA Western Standard Time' + val 'America/La_Paz' = s 'SA Western Standard Time' + val 'America/Lima' = s 'SA Pacific Standard Time' + val 'America/Los_Angeles' = s 'Pacific Standard Time' + val 'America/Louisville' = s 'Eastern Standard Time' + val 'America/Lower_Princes' = s 'SA Western Standard Time' + val 'America/Maceio' = s 'SA Eastern Standard Time' + val 'America/Managua' = s 'Central America Standard Time' + val 'America/Manaus' = s 'SA Western Standard Time' + val 'America/Marigot' = s 'SA Western Standard Time' + val 'America/Martinique' = s 'SA Western Standard Time' + val 'America/Matamoros' = s 'Central Standard Time' + val 'America/Mazatlan' = s 'Mountain Standard Time (Mexico)' + val 'America/Mendoza' = s 'Argentina Standard Time' + val 'America/Menominee' = s 'Central Standard Time' + val 'America/Merida' = s 'Central Standard Time (Mexico)' + val 'America/Metlakatla' = s 'Alaskan Standard Time' + val 'America/Mexico_City' = s 'Central Standard Time (Mexico)' + val 'America/Miquelon' = s 'Saint Pierre Standard Time' + val 'America/Moncton' = s 'Atlantic Standard Time' + val 'America/Monterrey' = s 'Central Standard Time (Mexico)' + val 'America/Montevideo' = s 'Montevideo Standard Time' + val 'America/Montserrat' = s 'SA Western Standard Time' + val 'America/Nassau' = s 'Eastern Standard Time' + val 'America/New_York' = s 'Eastern Standard Time' + val 'America/Nome' = s 'Alaskan Standard Time' + val 'America/Noronha' = s 'UTC-02' + val 'America/North_Dakota/Beulah' = s 'Central Standard Time' + val 'America/North_Dakota/Center' = s 'Central Standard Time' + val 'America/North_Dakota/New_Salem' = s 'Central Standard Time' + val 'America/Ojinaga' = s 'Central Standard Time' + val 'America/Panama' = s 'SA Pacific Standard Time' + val 'America/Paramaribo' = s 'SA Eastern Standard Time' + val 'America/Phoenix' = s 'US Mountain Standard Time' + val 'America/Port-au-Prince' = s 'Haiti Standard Time' + val 'America/Port_of_Spain' = s 'SA Western Standard Time' + val 'America/Porto_Velho' = s 'SA Western Standard Time' + val 'America/Puerto_Rico' = s 'SA Western Standard Time' + val 'America/Punta_Arenas' = s 'Magallanes Standard Time' + val 'America/Rankin_Inlet' = s 'Central Standard Time' + val 'America/Recife' = s 'SA Eastern Standard Time' + val 'America/Regina' = s 'Canada Central Standard Time' + val 'America/Resolute' = s 'Central Standard Time' + val 'America/Rio_Branco' = s 'SA Pacific Standard Time' + val 'America/Santarem' = s 'SA Eastern Standard Time' + val 'America/Santiago' = s 'Pacific SA Standard Time' + val 'America/Santo_Domingo' = s 'SA Western Standard Time' + val 'America/Sao_Paulo' = s 'E. South America Standard Time' + val 'America/Scoresbysund' = s 'Azores Standard Time' + val 'America/Sitka' = s 'Alaskan Standard Time' + val 'America/St_Barthelemy' = s 'SA Western Standard Time' + val 'America/St_Johns' = s 'Newfoundland Standard Time' + val 'America/St_Kitts' = s 'SA Western Standard Time' + val 'America/St_Lucia' = s 'SA Western Standard Time' + val 'America/St_Thomas' = s 'SA Western Standard Time' + val 'America/St_Vincent' = s 'SA Western Standard Time' + val 'America/Swift_Current' = s 'Canada Central Standard Time' + val 'America/Tegucigalpa' = s 'Central America Standard Time' + val 'America/Thule' = s 'Atlantic Standard Time' + val 'America/Tijuana' = s 'Pacific Standard Time (Mexico)' + val 'America/Toronto' = s 'Eastern Standard Time' + val 'America/Tortola' = s 'SA Western Standard Time' + val 'America/Vancouver' = s 'Pacific Standard Time' + val 'America/Whitehorse' = s 'Yukon Standard Time' + val 'America/Winnipeg' = s 'Central Standard Time' + val 'America/Yakutat' = s 'Alaskan Standard Time' + val 'Antarctica/Casey' = s 'Central Pacific Standard Time' + val 'Antarctica/Davis' = s 'SE Asia Standard Time' + val 'Antarctica/DumontDUrville' = s 'West Pacific Standard Time' + val 'Antarctica/Macquarie' = s 'Tasmania Standard Time' + val 'Antarctica/Mawson' = s 'West Asia Standard Time' + val 'Antarctica/McMurdo' = s 'New Zealand Standard Time' + val 'Antarctica/Palmer' = s 'SA Eastern Standard Time' + val 'Antarctica/Rothera' = s 'SA Eastern Standard Time' + val 'Antarctica/Syowa' = s 'E. Africa Standard Time' + val 'Antarctica/Vostok' = s 'Central Asia Standard Time' + val 'Arctic/Longyearbyen' = s 'W. Europe Standard Time' + val 'Asia/Aden' = s 'Arab Standard Time' + val 'Asia/Almaty' = s 'West Asia Standard Time' + val 'Asia/Amman' = s 'Jordan Standard Time' + val 'Asia/Anadyr' = s 'Russia Time Zone 11' + val 'Asia/Aqtau' = s 'West Asia Standard Time' + val 'Asia/Aqtobe' = s 'West Asia Standard Time' + val 'Asia/Ashgabat' = s 'West Asia Standard Time' + val 'Asia/Atyrau' = s 'West Asia Standard Time' + val 'Asia/Baghdad' = s 'Arabic Standard Time' + val 'Asia/Bahrain' = s 'Arab Standard Time' + val 'Asia/Baku' = s 'Azerbaijan Standard Time' + val 'Asia/Bangkok' = s 'SE Asia Standard Time' + val 'Asia/Barnaul' = s 'Altai Standard Time' + val 'Asia/Beirut' = s 'Middle East Standard Time' + val 'Asia/Bishkek' = s 'Central Asia Standard Time' + val 'Asia/Brunei' = s 'Singapore Standard Time' + val 'Asia/Calcutta' = s 'India Standard Time' + val 'Asia/Chita' = s 'Transbaikal Standard Time' + val 'Asia/Colombo' = s 'Sri Lanka Standard Time' + val 'Asia/Damascus' = s 'Syria Standard Time' + val 'Asia/Dhaka' = s 'Bangladesh Standard Time' + val 'Asia/Dili' = s 'Tokyo Standard Time' + val 'Asia/Dubai' = s 'Arabian Standard Time' + val 'Asia/Dushanbe' = s 'West Asia Standard Time' + val 'Asia/Famagusta' = s 'GTB Standard Time' + val 'Asia/Gaza' = s 'West Bank Standard Time' + val 'Asia/Hebron' = s 'West Bank Standard Time' + val 'Asia/Hong_Kong' = s 'China Standard Time' + val 'Asia/Hovd' = s 'W. Mongolia Standard Time' + val 'Asia/Irkutsk' = s 'North Asia East Standard Time' + val 'Asia/Jakarta' = s 'SE Asia Standard Time' + val 'Asia/Jayapura' = s 'Tokyo Standard Time' + val 'Asia/Jerusalem' = s 'Israel Standard Time' + val 'Asia/Kabul' = s 'Afghanistan Standard Time' + val 'Asia/Kamchatka' = s 'Russia Time Zone 11' + val 'Asia/Karachi' = s 'Pakistan Standard Time' + val 'Asia/Katmandu' = s 'Nepal Standard Time' + val 'Asia/Khandyga' = s 'Yakutsk Standard Time' + val 'Asia/Krasnoyarsk' = s 'North Asia Standard Time' + val 'Asia/Kuala_Lumpur' = s 'Singapore Standard Time' + val 'Asia/Kuching' = s 'Singapore Standard Time' + val 'Asia/Kuwait' = s 'Arab Standard Time' + val 'Asia/Macau' = s 'China Standard Time' + val 'Asia/Magadan' = s 'Magadan Standard Time' + val 'Asia/Makassar' = s 'Singapore Standard Time' + val 'Asia/Manila' = s 'Singapore Standard Time' + val 'Asia/Muscat' = s 'Arabian Standard Time' + val 'Asia/Nicosia' = s 'GTB Standard Time' + val 'Asia/Novokuznetsk' = s 'North Asia Standard Time' + val 'Asia/Novosibirsk' = s 'N. Central Asia Standard Time' + val 'Asia/Omsk' = s 'Omsk Standard Time' + val 'Asia/Oral' = s 'West Asia Standard Time' + val 'Asia/Phnom_Penh' = s 'SE Asia Standard Time' + val 'Asia/Pontianak' = s 'SE Asia Standard Time' + val 'Asia/Pyongyang' = s 'North Korea Standard Time' + val 'Asia/Qatar' = s 'Arab Standard Time' + val 'Asia/Qostanay' = s 'West Asia Standard Time' + val 'Asia/Qyzylorda' = s 'Qyzylorda Standard Time' + val 'Asia/Rangoon' = s 'Myanmar Standard Time' + val 'Asia/Riyadh' = s 'Arab Standard Time' + val 'Asia/Saigon' = s 'SE Asia Standard Time' + val 'Asia/Sakhalin' = s 'Sakhalin Standard Time' + val 'Asia/Samarkand' = s 'West Asia Standard Time' + val 'Asia/Seoul' = s 'Korea Standard Time' + val 'Asia/Shanghai' = s 'China Standard Time' + val 'Asia/Singapore' = s 'Singapore Standard Time' + val 'Asia/Srednekolymsk' = s 'Russia Time Zone 10' + val 'Asia/Taipei' = s 'Taipei Standard Time' + val 'Asia/Tashkent' = s 'West Asia Standard Time' + val 'Asia/Tbilisi' = s 'Georgian Standard Time' + val 'Asia/Tehran' = s 'Iran Standard Time' + val 'Asia/Thimphu' = s 'Bangladesh Standard Time' + val 'Asia/Tokyo' = s 'Tokyo Standard Time' + val 'Asia/Tomsk' = s 'Tomsk Standard Time' + val 'Asia/Ulaanbaatar' = s 'Ulaanbaatar Standard Time' + val 'Asia/Urumqi' = s 'Central Asia Standard Time' + val 'Asia/Ust-Nera' = s 'Vladivostok Standard Time' + val 'Asia/Vientiane' = s 'SE Asia Standard Time' + val 'Asia/Vladivostok' = s 'Vladivostok Standard Time' + val 'Asia/Yakutsk' = s 'Yakutsk Standard Time' + val 'Asia/Yekaterinburg' = s 'Ekaterinburg Standard Time' + val 'Asia/Yerevan' = s 'Caucasus Standard Time' + val 'Atlantic/Azores' = s 'Azores Standard Time' + val 'Atlantic/Bermuda' = s 'Atlantic Standard Time' + val 'Atlantic/Canary' = s 'GMT Standard Time' + val 'Atlantic/Cape_Verde' = s 'Cape Verde Standard Time' + val 'Atlantic/Faeroe' = s 'GMT Standard Time' + val 'Atlantic/Madeira' = s 'GMT Standard Time' + val 'Atlantic/Reykjavik' = s 'Greenwich Standard Time' + val 'Atlantic/South_Georgia' = s 'UTC-02' + val 'Atlantic/St_Helena' = s 'Greenwich Standard Time' + val 'Atlantic/Stanley' = s 'SA Eastern Standard Time' + val 'Australia/Adelaide' = s 'Cen. Australia Standard Time' + val 'Australia/Brisbane' = s 'E. Australia Standard Time' + val 'Australia/Broken_Hill' = s 'Cen. Australia Standard Time' + val 'Australia/Darwin' = s 'AUS Central Standard Time' + val 'Australia/Eucla' = s 'Aus Central W. Standard Time' + val 'Australia/Hobart' = s 'Tasmania Standard Time' + val 'Australia/Lindeman' = s 'E. Australia Standard Time' + val 'Australia/Lord_Howe' = s 'Lord Howe Standard Time' + val 'Australia/Melbourne' = s 'AUS Eastern Standard Time' + val 'Australia/Perth' = s 'W. Australia Standard Time' + val 'Australia/Sydney' = s 'AUS Eastern Standard Time' + val 'Etc/GMT' = s 'UTC' + val 'Etc/GMT+1' = s 'Cape Verde Standard Time' + val 'Etc/GMT+10' = s 'Hawaiian Standard Time' + val 'Etc/GMT+11' = s 'UTC-11' + val 'Etc/GMT+12' = s 'Dateline Standard Time' + val 'Etc/GMT+2' = s 'UTC-02' + val 'Etc/GMT+3' = s 'SA Eastern Standard Time' + val 'Etc/GMT+4' = s 'SA Western Standard Time' + val 'Etc/GMT+5' = s 'SA Pacific Standard Time' + val 'Etc/GMT+6' = s 'Central America Standard Time' + val 'Etc/GMT+7' = s 'US Mountain Standard Time' + val 'Etc/GMT+8' = s 'UTC-08' + val 'Etc/GMT+9' = s 'UTC-09' + val 'Etc/GMT-1' = s 'W. Central Africa Standard Time' + val 'Etc/GMT-10' = s 'West Pacific Standard Time' + val 'Etc/GMT-11' = s 'Central Pacific Standard Time' + val 'Etc/GMT-12' = s 'UTC+12' + val 'Etc/GMT-13' = s 'UTC+13' + val 'Etc/GMT-14' = s 'Line Islands Standard Time' + val 'Etc/GMT-2' = s 'South Africa Standard Time' + val 'Etc/GMT-3' = s 'E. Africa Standard Time' + val 'Etc/GMT-4' = s 'Arabian Standard Time' + val 'Etc/GMT-5' = s 'West Asia Standard Time' + val 'Etc/GMT-6' = s 'Central Asia Standard Time' + val 'Etc/GMT-7' = s 'SE Asia Standard Time' + val 'Etc/GMT-8' = s 'Singapore Standard Time' + val 'Etc/GMT-9' = s 'Tokyo Standard Time' + val 'Etc/UTC' = s 'UTC' + val 'Europe/Amsterdam' = s 'W. Europe Standard Time' + val 'Europe/Andorra' = s 'W. Europe Standard Time' + val 'Europe/Astrakhan' = s 'Astrakhan Standard Time' + val 'Europe/Athens' = s 'GTB Standard Time' + val 'Europe/Belgrade' = s 'Central Europe Standard Time' + val 'Europe/Berlin' = s 'W. Europe Standard Time' + val 'Europe/Bratislava' = s 'Central Europe Standard Time' + val 'Europe/Brussels' = s 'Romance Standard Time' + val 'Europe/Bucharest' = s 'GTB Standard Time' + val 'Europe/Budapest' = s 'Central Europe Standard Time' + val 'Europe/Busingen' = s 'W. Europe Standard Time' + val 'Europe/Chisinau' = s 'E. Europe Standard Time' + val 'Europe/Copenhagen' = s 'Romance Standard Time' + val 'Europe/Dublin' = s 'GMT Standard Time' + val 'Europe/Gibraltar' = s 'W. Europe Standard Time' + val 'Europe/Guernsey' = s 'GMT Standard Time' + val 'Europe/Helsinki' = s 'FLE Standard Time' + val 'Europe/Isle_of_Man' = s 'GMT Standard Time' + val 'Europe/Istanbul' = s 'Turkey Standard Time' + val 'Europe/Jersey' = s 'GMT Standard Time' + val 'Europe/Kaliningrad' = s 'Kaliningrad Standard Time' + val 'Europe/Kiev' = s 'FLE Standard Time' + val 'Europe/Kirov' = s 'Russian Standard Time' + val 'Europe/Lisbon' = s 'GMT Standard Time' + val 'Europe/Ljubljana' = s 'Central Europe Standard Time' + val 'Europe/London' = s 'GMT Standard Time' + val 'Europe/Luxembourg' = s 'W. Europe Standard Time' + val 'Europe/Madrid' = s 'Romance Standard Time' + val 'Europe/Malta' = s 'W. Europe Standard Time' + val 'Europe/Mariehamn' = s 'FLE Standard Time' + val 'Europe/Minsk' = s 'Belarus Standard Time' + val 'Europe/Monaco' = s 'W. Europe Standard Time' + val 'Europe/Moscow' = s 'Russian Standard Time' + val 'Europe/Oslo' = s 'W. Europe Standard Time' + val 'Europe/Paris' = s 'Romance Standard Time' + val 'Europe/Podgorica' = s 'Central Europe Standard Time' + val 'Europe/Prague' = s 'Central Europe Standard Time' + val 'Europe/Riga' = s 'FLE Standard Time' + val 'Europe/Rome' = s 'W. Europe Standard Time' + val 'Europe/Samara' = s 'Russia Time Zone 3' + val 'Europe/San_Marino' = s 'W. Europe Standard Time' + val 'Europe/Sarajevo' = s 'Central European Standard Time' + val 'Europe/Saratov' = s 'Saratov Standard Time' + val 'Europe/Simferopol' = s 'Russian Standard Time' + val 'Europe/Skopje' = s 'Central European Standard Time' + val 'Europe/Sofia' = s 'FLE Standard Time' + val 'Europe/Stockholm' = s 'W. Europe Standard Time' + val 'Europe/Tallinn' = s 'FLE Standard Time' + val 'Europe/Tirane' = s 'Central Europe Standard Time' + val 'Europe/Ulyanovsk' = s 'Astrakhan Standard Time' + val 'Europe/Vaduz' = s 'W. Europe Standard Time' + val 'Europe/Vatican' = s 'W. Europe Standard Time' + val 'Europe/Vienna' = s 'W. Europe Standard Time' + val 'Europe/Vilnius' = s 'FLE Standard Time' + val 'Europe/Volgograd' = s 'Volgograd Standard Time' + val 'Europe/Warsaw' = s 'Central European Standard Time' + val 'Europe/Zagreb' = s 'Central European Standard Time' + val 'Europe/Zurich' = s 'W. Europe Standard Time' + val 'Indian/Antananarivo' = s 'E. Africa Standard Time' + val 'Indian/Chagos' = s 'Central Asia Standard Time' + val 'Indian/Christmas' = s 'SE Asia Standard Time' + val 'Indian/Cocos' = s 'Myanmar Standard Time' + val 'Indian/Comoro' = s 'E. Africa Standard Time' + val 'Indian/Kerguelen' = s 'West Asia Standard Time' + val 'Indian/Mahe' = s 'Mauritius Standard Time' + val 'Indian/Maldives' = s 'West Asia Standard Time' + val 'Indian/Mauritius' = s 'Mauritius Standard Time' + val 'Indian/Mayotte' = s 'E. Africa Standard Time' + val 'Indian/Reunion' = s 'Mauritius Standard Time' + val 'Pacific/Apia' = s 'Samoa Standard Time' + val 'Pacific/Auckland' = s 'New Zealand Standard Time' + val 'Pacific/Bougainville' = s 'Bougainville Standard Time' + val 'Pacific/Chatham' = s 'Chatham Islands Standard Time' + val 'Pacific/Easter' = s 'Easter Island Standard Time' + val 'Pacific/Efate' = s 'Central Pacific Standard Time' + val 'Pacific/Enderbury' = s 'UTC+13' + val 'Pacific/Fakaofo' = s 'UTC+13' + val 'Pacific/Fiji' = s 'Fiji Standard Time' + val 'Pacific/Funafuti' = s 'UTC+12' + val 'Pacific/Galapagos' = s 'Central America Standard Time' + val 'Pacific/Gambier' = s 'UTC-09' + val 'Pacific/Guadalcanal' = s 'Central Pacific Standard Time' + val 'Pacific/Guam' = s 'West Pacific Standard Time' + val 'Pacific/Honolulu' = s 'Hawaiian Standard Time' + val 'Pacific/Kiritimati' = s 'Line Islands Standard Time' + val 'Pacific/Kosrae' = s 'Central Pacific Standard Time' + val 'Pacific/Kwajalein' = s 'UTC+12' + val 'Pacific/Majuro' = s 'UTC+12' + val 'Pacific/Marquesas' = s 'Marquesas Standard Time' + val 'Pacific/Midway' = s 'UTC-11' + val 'Pacific/Nauru' = s 'UTC+12' + val 'Pacific/Niue' = s 'UTC-11' + val 'Pacific/Norfolk' = s 'Norfolk Standard Time' + val 'Pacific/Noumea' = s 'Central Pacific Standard Time' + val 'Pacific/Pago_Pago' = s 'UTC-11' + val 'Pacific/Palau' = s 'Tokyo Standard Time' + val 'Pacific/Pitcairn' = s 'UTC-08' + val 'Pacific/Ponape' = s 'Central Pacific Standard Time' + val 'Pacific/Port_Moresby' = s 'West Pacific Standard Time' + val 'Pacific/Rarotonga' = s 'Hawaiian Standard Time' + val 'Pacific/Saipan' = s 'West Pacific Standard Time' + val 'Pacific/Tahiti' = s 'Hawaiian Standard Time' + val 'Pacific/Tarawa' = s 'UTC+12' + val 'Pacific/Tongatapu' = s 'Tonga Standard Time' + val 'Pacific/Truk' = s 'West Pacific Standard Time' + val 'Pacific/Wake' = s 'UTC+12' + val 'Pacific/Wallis' = s 'UTC+12' + } + } + } } NoRemove SYSTEM { diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index a31c467f71f..7dc5f72bcbb 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -264,6 +264,15 @@ static ULONG_PTR system_cpu_mask; static pthread_mutex_t timezone_mutex = PTHREAD_MUTEX_INITIALIZER; +static const char default_tzinfo_dir[] = "/usr/share/zoneinfo"; +static const WCHAR Time_ZonesW[] = { '\\','R','e','g','i','s','t','r','y','\\', + 'M','a','c','h','i','n','e','\\', + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s',' ','N','T','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'T','i','m','e',' ','Z','o','n','e','s',0 }; + /******************************************************************************* * Architecture specific feature detection for CPUs * @@ -2860,13 +2869,6 @@ done: static void find_reg_tz_info(RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi, const char* tz_name, int year) { - static const WCHAR Time_ZonesW[] = { '\\','R','e','g','i','s','t','r','y','\\', - 'M','a','c','h','i','n','e','\\', - 'S','o','f','t','w','a','r','e','\\', - 'M','i','c','r','o','s','o','f','t','\\', - 'W','i','n','d','o','w','s',' ','N','T','\\', - 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'T','i','m','e',' ','Z','o','n','e','s',0 }; RTL_DYNAMIC_TIME_ZONE_INFORMATION reg_tzi; HANDLE key; ULONG idx, len; @@ -2941,6 +2943,76 @@ static time_t find_dst_change(time_t start, time_t end, int *is_dst) return min; } +static BOOL get_tz_info_from_zoneinfo_name( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi, const char *name, int year ) +{ + static const WCHAR wine_tz_map[] = { '\\','R','e','g','i','s','t','r','y','\\', + 'M','a','c','h','i','n','e','\\', + 'S','o','f','t','w','a','r','e','\\', + 'W','i','n','e','\\', + 'T','i','m','e',' ','Z','o','n','e','s','\\', + 'T','Z',' ','M','a','p','p','i','n','g', + 0 }; + + const char *tzinfo_dir = getenv( "TZDIR" ); + UNICODE_STRING key_name, win_name; + WCHAR nameW[64], win_nameW[64]; + OBJECT_ATTRIBUTES attr; + char buf[MAX_PATH]; + HANDLE key; + BOOL ret; + FILE *f; + + TRACE( "name %s.\n", debugstr_a( name )); + + if (strlen(name) >= ARRAY_SIZE(nameW)) return FALSE; + + if (!tzinfo_dir) tzinfo_dir = default_tzinfo_dir; + snprintf( buf, sizeof(buf), "%s/%s", tzinfo_dir, name ); + + if (!(f = fopen( buf, "r" ))) + { + WARN( "Could not open %s.\n", debugstr_a( buf )); + return FALSE; + } + fclose( f ); + + init_unicode_string( &key_name, wine_tz_map ); + InitializeObjectAttributes( &attr, &key_name, 0, NULL, NULL ); + if (NtOpenKey( &key, KEY_READ, &attr )) return FALSE; + + ascii_to_unicode( nameW, name, strlen( name ) + 1 ); + ret = reg_query_value( key, nameW, REG_SZ, win_nameW, sizeof(win_nameW) ); + NtClose( key ); + if (!ret) return FALSE; + TRACE( "got %s for %s.\n", debugstr_w(win_nameW), debugstr_a( name ) ); + + init_unicode_string( &key_name, Time_ZonesW ); + if (NtOpenKey( &key, KEY_READ, &attr )) return FALSE; + init_unicode_string( &win_name, win_nameW ); + ret = read_reg_tz_info( key, &win_name, year, tzi ); + NtClose( key ); + return ret; +} + +static BOOL get_system_config_tz_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi, int year ) +{ + char path[PATH_MAX]; + const char *str; + int len; + + if ((str = getenv( "TZ" ))) + { + if (*str == ':') ++str; + return get_tz_info_from_zoneinfo_name( tzi, str, year ); + } + + if (!realpath( "/etc/localtime", path )) return FALSE; + len = sizeof( default_tzinfo_dir ) - 1; + if (strncmp( path, default_tzinfo_dir, len )) return FALSE; + if (path[len] != '/') return FALSE; + return get_tz_info_from_zoneinfo_name( tzi, path + len + 1, year ); +} + static LONG64 get_current_tz_bias(void) { ULONG high, low; @@ -2959,6 +3031,7 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi ) { static RTL_DYNAMIC_TIME_ZONE_INFORMATION cached_tzi; static int current_year = -1, current_bias = 65535; + RTL_DYNAMIC_TIME_ZONE_INFORMATION reg_tzi; struct tm *tm; char tz_name[16]; time_t year_start, year_end, tmp, dlt = 0, std = 0; @@ -3074,6 +3147,16 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi ) tzi->StandardBias); } + if (get_system_config_tz_info( ®_tzi, current_year + 1900 )) + { + if (match_tz_info( tzi, ®_tzi ) && match_tz_name( tz_name, ®_tzi )) + { + cached_tzi = *tzi = reg_tzi; + mutex_unlock( &timezone_mutex ); + return; + } + WARN( "System config TZ info didn't match guessed parameters, falling back to search.\n" ); + } find_reg_tz_info(tzi, tz_name, current_year + 1900); cached_tzi = *tzi; mutex_unlock( &timezone_mutex ); diff --git a/tools/make_unicode b/tools/make_unicode index f7ccbd8131d..3cb4ab80c4a 100755 --- a/tools/make_unicode +++ b/tools/make_unicode @@ -71,6 +71,7 @@ my $MAX_CHAR = 0x10ffff; my $nlskey = "-SYSTEM\\-CurrentControlSet\\-Control\\-Nls"; my $zonekey = "-Software\\-Microsoft\\-Windows NT\\-CurrentVersion\\Time Zones"; +my $winezonekey = "-Software\\-Wine\\Time Zones"; my @allfiles = ( @@ -5501,6 +5502,7 @@ sub load_windows_zones() { my $current_name; my %names; + my %mapping; my $base = "cldr-release-$CLDRVERSION"; my $INPUT = open_data_file( "cldr", "$base/common/supplemental/windowsZones.xml" ); while (<$INPUT>) @@ -5513,9 +5515,16 @@ sub load_windows_zones() { $names{$1} = [ $current_name, $2 ]; } + if (/<mapZone other="(.*)" territory=(.*) type="(.*)"\/>/) + { + foreach my $name (split ' ', $3) + { + $mapping{$name} = $1; + } + } } close $INPUT; - return %names; + return (\%names, \%mapping); } @@ -5638,7 +5647,7 @@ sub dump_timezones($@) my $FIRST_YEAR = 2000; my $LAST_YEAR = 2030; - my %names = load_windows_zones(); + my ($names, $mapping) = load_windows_zones(); my %zones; my %rules; my %links; @@ -5694,9 +5703,10 @@ sub dump_timezones($@) close $FILE; } - foreach my $name (sort { uc($a) cmp uc($b) } keys %names) + foreach my $name (sort { uc($a) cmp uc($b) } keys %{$names}) { - my ($display, $zone) = @{$names{$name}}; + my ($display, $zone) = @{%{$names}{$name}}; + $zone = $links{$zone} if defined $links{$zone}; # build list of transitions @@ -5865,6 +5875,12 @@ sub dump_timezones($@) add_registry_dword_value( $zonekey, "$name\\Dynamic DST", "LastEntry", $last_year ); } + foreach my $map (sort { uc($a) cmp uc($b) } keys %{$mapping}) + { + my $name = %{$mapping}{$map}; + add_registry_string_value( $winezonekey, "TZ Mapping", $map, $name ); + } + print OUTPUT "}\n"; close OUTPUT; save_file($filename); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10134