Phoenix Phlash -- десять лет в строю

22 октябрь, 2002 - 23:00Михаил Закусило
На первый взгляд Phoenix BIOS на современных системных платах -- явление не самое распространенное. Вместе с тем более 70% персональных систем оснащены продуктами Phoenix Technologies, и каждый час в мире появляется 35 тыс. аппаратных решений с Phoenix BIOS. В сражении за симпатии пользователей Phoenix держится в тени, пропуская на передний план производителей и чипсетов, и системных плат, но оставаясь самым влиятельным в среде разработчиков серверных платформ, ноутбуков, сложных контроллеров. BIOS есть BIOS, и для работы с ней должны быть утилиты. Об одной из них наш рассказ.

У нас в Бакардии прятки -- национальная игра.
Р. Л. Стивенсон,
Приключения принца Флоризеля

"Когда мы были молодыми..."

Десять лет назад знакомство с продуктами Phoenix ограничивалось платами для процессора i386, и мысли о перепрограммировании BIOS пользователям в голову не приходили. Есть ли разница, какая она на плате -- от Award, AMI, Phoenix или Quadtel. В первую очередь это происходило потому, что ее обновление в то время не было вынужденным шагом, направленным на поддержание работоспособности системы.

Phoenix Phlash -- десять лет в строю
Рис. 1. Утилита Phoenix Phlash16

Многое изменилось за последнее время. Стремительное развитие элементной базы, и в первую очередь появление перезаписываемых запоминающих устройств -- Flash ROM, потребовало адекватной реакции производителей BIOS. И не только для того, чтобы обеспечить совместимость с аппаратными новинками: жесткими дисками предельных размеров, диковинными контроллерами ввода/вывода, схемами системного мониторинга. Свой вклад во взаимодействие программных и аппаратных средств вносят операционные системы. Самые современные из них требуют, чтобы BIOS обеспечила поддержку ACPI, резервирование и "горячую" замену.

Поначалу для каждой материнской платы, набора системной логики или модели микросхемы Flash создавались свои версии утилит, позволяющие сменить BIOS. Недостатки первых версий программ были очевидны, и только к 1992 году производители BIOS представили собственные реализации универсальных утилит.


Платформа и ее особенности

Phoenix Phlash -- десять лет в строю
Рис. 2. Утилита Phoenix WinPhlash

Движение Phoenix к программным технологиям апгрейда оказалось несколько запоздалым, хотя первую свою BIOS компания продала еще в 1983 году. Вероятной причиной были финансовые трудности, с которыми Phoenix Technologies столкнулась на заре 90-х годов.

Первоначальная идея состояла в том, чтобы, создавая универсальную утилиту Phoenix Phlash, обслуживание системной платы (платформы) возложить на два ключа: дескриптор микросхем Flash и дескриптор аппаратных особенностей.

Понятие платформы, впервые предложенное Phoenix Technologies, стало доминирующим в среде разработчиков компьютерных систем. По смыслу оно шире, чем понятие системной платы, платформа определяется как аппаратный продукт на основе детерминированных компонентов (набор системной логики, контроллеры обслуживания периферии и т. п.).

Запоминающее устройство ROM хотя и является неотъемлемой частью платформы, рассматривается как отдельная подсистема. Если платформа в данном случае есть средство для доступа к Flash ROM, то сами запоминающие элементы -- цель для утилиты перепрограммирования. Такое противоречие, заложенное с самого начала работ, проявилось с момента выхода первых рабочих версий утилиты. Кроме файла PHLASH.EXE, для программирования требовалось иметь еще два файла -- PHLASH.INI, который использовался для конфигурирования платформы, и DEVTBLS.DAT, в нем хранилось описание программируемых микросхем Flash ROM.

Просуществовав чуть более года, такой подход пришел к логическому завершению. Начиная с версии 1.07 для работоспособности утилиты Phoenix Phlash требуется только один конфигурационный файл PLATFORM.BIN. В нем сведены воедино и особенности аппаратной реализации платы, и поддержка перепрограммируемых устройств -- микросхем Flash ROM.


Конфигурационный файл...

Phoenix Phlash -- десять лет в строю
Рис. 3. Управление полем UUID

Чем отличается BIOS серверной платформы от аналогичных настольных продуктов? Кроме всего прочего, это минимизация простоя аппаратных средств и, как следствие, высокая надежность всех программных компонентов. Именно в этом состоит смысл модернизации утилиты Phlash, выполненной Phoenix Technologies на рубеже 1994--1995 гг.

Изменения коснулись не только таблицы Flash ROM, которая в ранних версиях размещалась в DEVTBLS.DAT. Один из разделов PLATFORM.BIN включает в себя библиотеку алгоритмов программирования каждого из типов запоминающих устройств, а также библиотеку очень важных подпрограмм, детализирующих особенности используемой платформы. В силу того что дизайн сложных платформ предполагает ряд уникальных аппаратных решений, остановимся на процедурах, обеспечивающих доступ к Flash ROM и управление процессом перепрограммирования.

1. Перед выполнением всех действий необходимо снять блокировку сигнала Flash Write Enable.

2. Запретить Shadow с тем, чтобы обращение к BIOS перенаправлялось к региону Flash ROM, а не к его копии в RAM.

3. Запретить кэширование, все операции должны выполняться с реальными объектами, исключая отложенную запись и упреждающее чтение.

4. Разрешить подачу программирующего напряжения Vpp, что особенно важно для обслуживания некоторых микросхем Flash.

5. Очистить буфер контроллера клавиатуры.

6. Запретить генерацию прерываний на шине USB.

7. После программирования привести регистры чипсета в такое состояние, которое бы исключало любые зависания в процессе перезагрузки.

Последнее особенно важно в том смысле, что на серверных платформах процесс перезаписи Flash может выполняться через удаленную консоль. Перезагрузка системы как обязательное явление после обновления BIOS должна сопровождаться гарантированным стартом.

Сложность написания универсальной программы заключается в следующем. Во-первых, каждый чипсет имеет свои регистры для обеспечения доступа в регионы 32-битового адресного пространства FFF80000h-FFFFFFFFh, где расположен Flash ROM. Во-вторых, каждый производитель платформы по-своему реализует подачу напряжения программирования. И, наконец, в-третьих, для прошивки Flash ROM разных производителей зачастую требуются различные алгоритмы.

Как видно, правильный результат при программировании Flash ROM обусловлен в большей мере тонкой настройкой ресурсов материнской платы. За такую настройку у Phoenix Phlash отвечает внешний файл PLATFORM.BIN. Значит, задача владельца материнской платы -- не только подыскать "свежую" версию BIOS и утилиту для программирования, но и не ошибиться в использовании конфигурационного файла, иначе последствия могут быть плачевные.


...и его структура

Как и сама утилита Phoenix Phlash, конфигурационный файл PLATFORM.BIN претерпел ряд изменений, отражающих динамику развития платформы PC. На сегодня известен ряд версий PLATFORM.BIN, последней из которых является v.2.00. Все конфигурационные файлы независимо от даты создания и версии имеют сходную структуру, которая определяется двумя сигнатурами: меткой ZQFD (initialiZe eQuates for File of Data) и меткой ZQFC (initialiZe eQuates for File of Code), расположенными по смещениям 0x40 и 0x100 соответственно. Начальные байты файла предусмотрительно зарезервированы для комментария, описывающего платформу. Как правило, Phoenix Technologies поставляет разработчику платформы конфигурационный файл с комментарием "This is a configuration file for PHLASH.EXE", который может быть отредактирован по усмотрению производителя платы.

Метка ZQFD, как следует из ее названия, описывает файл данных (читай -- блок данных), необходимых для идентификации платформы. Вслед за сигнатурной меткой и расположена искомая нами версия конфигурационного файла. Для современных платформ это, как правило, код 2.00.

Если номер версии носит только информативный характер, то последующие данные имеют принципиальное значение для пользователя системной платы. В первую очередь это касается имени файла BIOS, его размера, режимов программирования микросхем Flash ROM.

В большинстве случаев по умолчанию используется имя файла BIOS.ROM. Для пользователя это может быть существенно, так как родительское имя BIOS.* порождает соответствующие имена для резервных копий (BIOS.BAK) и, что самое важное, определяет процедуру восстановления (BIOS Recovery), когда поиск нужного файла выполняется системой "вслепую".

Связующим звеном между логическим именем BIOS и физическим носителем служит размер файла. Вне всяких сомнений, для корректной работы процедуры обновления необходимо однозначное соответствие этих параметров. Несмотря на то что инженеры Phoenix Technologies предусмотрели поддержку широкого спектра микросхем Flash, только одно из устройств приобретает статус "по умолчанию", для которого в полях блока ZQFD хранятся код производителя и код устройства.

Подавляющее большинство микросхем Flash имеют программно доступные идентификаторы Manufacturer Code и Device Code, которые можно получить с помощью определенного алгоритма, различного для большинства производителей Flash ROM. Обобщенно набор команд для получения этих кодов носит название "Read Intelligent Identifier" или коротко ReadID.

Если требуется обслуживать Flash ROM, не поддерживающие команду ReadID, алгоритм становится более сложным и специфичным для конкретной модели микросхемы. Но как бы то ни было, все запоминающие устройства (ЗУ) определяются кодами производителя и устройства. Если тип установленного ЗУ не совпадает с данными в ZQFD, то в действие будет запущен механизм поиска нужной информации, хранящейся в блоке данных ZQFC.

Прежде чем перейти к рассмотрению блока ZQFC, отметим, что для пользователя утилиты Phoenix Phlash самым важным является битовое поле флагов, определяющее значения по умолчанию и приоритеты процедуры обновления BIOS. Эта информация неразрывно связана с управляющими ключами самой утилиты.


Ключи к пониманию

Как и большинство своих собратьев, утилита Phoenix Phlash позволяет регулировать процесс обновления в зависимости от тех или иных условий эксплуатации. За это отвечают управляющие ключи. К сожалению, полноценное использование всех возможностей одного из мощнейших программных продуктов Phoenix Technologies затруднено из-за отсутствия толковой документации. Ряд ключей недокументирован даже во встроенном меню помощи. Мы постараемся ликвидировать этот пробел: во врезке привены значения приведены значения большинства ключей утилиты, включая недокументированные.

Ключи утилиты Phoenix Phlash

/? | /H - Помощь

По ключу /? доступны не все возможности. В таких случаях в комментариях приводятся соответствующие примечания. На странице помощи не отражен тот факт, что использование ключей воспринимается программой Phoenix Phlash аддитивно. Это значит, что выбранные из файла PLATFORM.BIN опции только дополняются и уточняются управляющими ключами, но не упраздняются ими.


/A - Не использовать автоопределение

Определение набора системной логики для настройки регистров доступа к Flash ROM не выполняется. Управляющая информация вычитывается из конфигурационного файла PLATFORM.BIN. В случае, если в конфигурационном файле метки ZQFD и ZQFC не обнаружены, выполнение программы Phoenix Phlash прекращается и выводится сообщение:

Failed to locate signature bytes in PLATFORM.BIN

Настоящий релиз Phoenix Phlash поддерживает конфигурационные файлы версий V0.10 и V2.00. Номер версии следует в конфигурационном файле непосредственно за меткой ZQFD. В противном случае появляется сообщение:

Unsupported PLATFORM.BIN file version

/B[=File] - Назначение конфигурационного файла

По умолчанию утилита программирования выполняет поиск в стартовой директории конфигурационный файл PLATFORM.BIN. С помощью ключа /B можно переназначить имя конфигурационного файла. Следует отметить, что ранние версии, например Phoenix Phlash V1.04, в качестве конфигурационного файла использовали по умолчанию имя PHLASH.INI. В случае, если конфигурационный файл не обнаружен, выполнение утилиты Phoenix Phlash становится невозможным, появляется сообщение

File Open failed on PLATFORM.BIN

/BU[=File] - Сохранение предыдущей версии BIOS

Использование ключа /BU позволяет сохранить текущий образ BIOS в стартовой директории. Наличие конфигурационного файла обязательно. Если имя сохраняемого файла не указано, из PLATFORM.BIN выбирается имя установленное по умолчанию. По смещению 048h, как правило, в этом файле хранится текст BIOS.ROM. В этом случае сохраняемый файл будет иметь имя BIOS.BAK. В случае, если в текущем директории имеется одноименный файл, появляется сообщение:

BIOS.BAK already exists (rename or delete it).

Для успешного выполнения операции требуется переименовать или удалить предыдущую копию файла BIOS.BAK. Если в опциях конфигурационного файла PLATFORM.BIN операция сохранения запрещена, выводится сообщение

BIOS backup not supported in PLATFORM.BIN


/C - Сброс параметров CMOS

После программирования микросхемы Flash выполняется обнуление контрольных сумм CMOS.


/CS - Проверка контрольной суммы BIOS

Выполняется проверка контрольных сумм образа BIOS. Если в процессе проверки обнаруживается несовпадение, все дальнейшие действия отменяются и выполнение утилиты прекращается.


/CZ - Очистка полей CMOS

В отличие от ключа /C, действие которого распространяется только на контрольную сумму CMOS, по данному ключу выполняется обнуление всех полей CMOS.


/Donnn - Изменить содержимое строки DMI

Если прописаны OEM строки в области DMI, то выполняется замена строки номер nnn на указанную в поле ключа. Номер строки изменяется от 0 до 8, но ограничен специфицированным для данного BIOS количеством. Текст вводимой строки указывается в строке через двоеточие. Синтаксис выглядит следующим образом /DO1 "This is OEM string for DMI pool".

Данный ключ недокументирован. Его выполнение регламентируется опциями компиляции системного BIOS


/DEV - Список поддерживаемых микросхем Flash ROM

Выполнение программы с ключем /DEV позволяет получить список поддерживаемых микросхем Flash ROM без выполнения программирования BIOS.


/EXIT - Возврат в DOS

Программирование Flash ROM завершается возвратом в операционную систему. В виду того, что в процессе обновления регистры набора системной логики настраивались определенным образом, система может находится в нестабильном состоянии. По этой причине данный ключ не внесен в список документированных и не визуализируется по /?


/I - Проверка размера файла BIOS

Выполняется проверка размера имеющегося образа BIOS и установленного на материнской плате микросхемы Flash ROM. В случае несоответствия выводится сообщение

BIOS ROM file size doesn't match flash part size

/L - указатель типа платформы

Данный ключ используется для программирования FWH (Firmware Hub) в системах, лишенных ISA шины, т.е. Legacy Free.


/MFG - Manufacturing mode

Режим автоматического программирования: в процессе работы не требуется ввод пользователем каких бы то ни было управляющих кодов. Для завершения процесса не требуется подтверждение с клавиатуры. Рекомендуется к использованию в .BAT файлах для режима автоматического программирования в системах без монитора.


/MODE - Режим программирования

Это недокументированный ключ, который принимает значение в диапазоне от 0 до 3. Смысл комбинации /MODE=0 неизвестен. Использование ключа /MODE=1 позволяет выполнить только обновление DMI области без изменения содержимого других полей Flash ROM. В режиме /MODE=2 выполняется обновление всего содержимого микросхемы. Если задан режим /MODE=3, содержимое DMI области устанавливается в соответствии с содержимым файла с образом BIOS.


/N - Режим обновления

Программирование Flash ROM выполняется только в случае, если образ BIOS на внешнем носителе отличается от системного BIOS. Рекомендуется к использованию в случае, когда неизвестна версия обновляемого BIOS.


/NOB - Запрет на обновление

Обновление системного BIOS не выполняется, если дата создания образа BIOS на внешнем носителе отличается от даты создания системного BIOS.


/NoBIOSInfo - Режим визуализации

При перепрограммировании не выводится на экран дата создания BIOS и тип микросхемы Flash ROM.


/O - Приоритет опций

Опции, заданные в файле PLATFORM.BIN, игнорируются. Принимаются во внимание только значения ключей программы Phlash.


/P - Режим тиражирования

Использование ключа /P позволяет установить режим тиражирования, при котором параметры всех задержек будут установлены в минимальное значение, на экран выводится только необходимая информация в минимальном объеме.


/PF="управляющий литерал"

Недокументированная возможность для гибкого управления процессом программирования зависит от конкретной платформы и реализации. В частности, использование конструкции /PF="!" позволяет перепрограммировать Boot Block.


/PN - Проверка файла BIOS на соответствие материнской плате

Система кодификации PhoenixBIOS 4.0 Release 6.0 состоит в том, что модуль BCPSYS содержит идентификационную метку Part Number (PN), следующей структуры:

BBBBBBBROOO, где

BBBBBBBBoard ID, поле длиной от 1 до 7 символов;

RRevision of Board, поле длиной 1 символ;

OOOOEM ID, поле длиной 3 симовола.


Смысл процедуры проверки на соответствие состоит в сравнении только PN без учета остальных полей идентификационной строки, куда входят также номер подверсии (Build ID), тип BIOS и дата его построения.


/RO[=имя] - Сохранить содержимое Flash ROM в файл

Распакованный образ системного BIOS сохраняется в файле на внешнем носителе с заданным именем. Если имя не указано, по умолчанию выбирается имя, заданное в конфигурационном файле. В случае если в текущем директории имеется одноименный файл, появляется сообщение:

BIOS.BAK already exists (rename or delete it).

Для успешного выполнения операции требуется переименовать или удалить предыдущую копию файла BIOS.BAK


/Rnnn - Количество попыток программирования

В случае если возник сбой при перепрограммировании микросхемы Flash ROM, имеется возможность задать количество попыток до успешного завершения операции. Значение параметра nnn изменяется в пределе 0-65535


/S - Выполнение операций в режиме Silent

Запрещается вывод в системный динамик сопровождающих звуковых сигналов.


/SE - Секторное стирание

Данный ключ предназначен для чипа Atmel AT49F002, состоящего из нескольких секторов, каждый из которых может быть перепрограммирован независимо от других.


/SWAP=NO - Disable Axx swapping

Если подключение запоминающего устройства, в котором хранится BIOS, выполняется не в соответствии с заводской нумерацией выводов, говорят, что имеет место переназначение линий данных - swap.

Такой подход впервые был использован для подключения двух 8-ми битных запоминающих устройств к 16-ти битной шине данных. В одном из них хранились четные байты (Even), в другом - нечетные (Odd). В дальнейшем для хранения BIOS использовался один чип, содержащий два блока четных и нечетных байт. Хотя большинство производителей давно отказалось от такого подхода, до настоящего времени существуют подобного рода реализации, например, BIOS для видеоконтроллеров Trident.


/SO=normal или /SO=compat

Назначение ключа /SO (Select Operation) напрямую связано с использованием нескольких запоминающих устройств для хранения BIOS. В режиме normal используется непрерывная адресация четных и нечетных байтов. В режиме compat (редукция от compatibility) - выборка младших адресов осуществляется с младшего (по аппаратной реализации) запоминающего устройства.


/V - Режим верификации

Устанавливается режим верификации, т.е. контрольного считывания и сравнения для каждого программируемого блока.


/X - Игнорировать менеджер XMS памяти

Если в процессе старта операционной системы была выполнена загрузка менеджера памяти типа EMM386, использующих режим виртуального процессора x86, то выполняется отключение драйверов верхней памяти. Затем выполняется процедура программирования Flash ROM. Данный ключ не документирован, его действие проверено опытным путем.


/Z - Режим стирания

Устанавливается режим стирания блока Flash ROM, при котором в каждый стираемый блок предварительно записывается последовательность нулей.



Младший брат, старший брат

Phoenix Phlash -- десять лет в строю
Рис. 4. Управляющие флаги Phoenix WinPhlash
После детального описания возможностей Phoenix Phlash несколько обескураживающим выглядит резюме: дни утилиты сочтены. "Что придет на смену?" -- спросит читатель-оптимист. "Зачем такие подробности?" -- спросит пессимист.

Не будем впадать в крайности, а рассмотрим все, что предлагает нам Phoenix Technologies по порядку следования.

Может быть, владельцы самых современных серверных платформ обратили внимание, что наряду с уже известной утилитой ряд плат сопровождается почти таким же продуктом с почти таким же именем -- Phlash16. Исключение составляет комментарий для пользователя, в котором предписывается выполнять перепрограммирование в среде DOS 7.x -- постоянного спутника Windows 9x. И строго-настрого запрещается использовать MS-DOS 6.22! Реплика, которая напрашивается сама собой, "Ну где же сейчас найти такое ископаемое!", вряд ли что объяснит.

Если бы не было этой статьи, может быть, никто бы и не обратил внимания на тот факт, что к Phlash16 не прилагается непременный атрибут -- файл PLATFORM.BIN. Но самое главное -- это размер файла с образом BIOS. Вместо ожидаемых и постоянных 131072, 262144 или 524288 байт файлы бывают разными и всегда бoльшими. Теперь нетрудно догадаться, где в данном случае находится PLATFORM.BIN.

Одним из нововведений в Phlash16 стала возможность с помощью файла BIOS.WPH (а сейчас он называется интерфейсом для обновления) разместить образ BIOS по абсолютному 32-разрядному адресу, который указал пользователь. Для современных серверных платформ, перешагнувших барьер 4 GB, эта возможность совсем нелишняя.

Несколько слов об управляющих ключах. Обратная совместимость (как непременный показатель качества программного продукта) стала для Phoenix отправной точкой при проектировании нового поколения средств апгрейда BIOS. "Все новое -- хорошо забытое старое", -- скажет опытный инженер пессимисту-читателю и смело начнет использовать управляющие ключи от старой версии. Однако на ряд отличий полезно обратить внимание.

/BBLПрограммирование Boot Block становится обязательной опцией.

/DOxxКлючи для обновления DMI приобрели структурированный вид и наконец-то стали документированной возможностью утилиты.

/REMOTE Вводится возможность удаленного управления процессом перепро-граммирования.

/SO Ключ давно потерял смысл и изъят из обращения.


Структура файла PLATFORM.BIN

Раздел Комментарий
ZQFD Data File
  Версия PLATFORM.BIN
  Имя BIOS по умолчанию
  Размер файла BIOS
  Код производителя (Manufacturer Code) Flash ROM
  Код устройства Flash ROM (Device Code)
  Флаги конфигурации Phlash.exe
ZQFC Code File
  Таблица обслуживаемых Flash ROM
  Библиотека алгоритмов программирования
  Библиотека служебных подпрограмм


И снова о многозадачной среде

Обратив внимание на расширение имени файла WPH в предыдущем разделе и выделив там сочетание PH ("яркие перышки из хвоста Phoenix"), литеру W однозначно следует трактовать как признак возможности выполнения приложения из Windows. Конечно, это делается не с помощью Phlash16, которая поставляется бесплатно. Что же предлагается "продвинутым" пользователям?

Прошлогодние сомнения (см. "Компьютерное Обозрение", # 10, 2001) в том, можно ли и нужно ли выполнять обновление BIOS из многозадачной среды, оказались не более чем рефлексией, когда за дело взялся Phoenix. Как следует из информации на сайте www.phoenix.com, существуют две коммерческие версии утилиты WinPhlash, которая обеспечивает графический интерфейс для 32-битового приложения, чья задача -- программирование Flash ROM. По сути, различия невелики -- упрощенная версия лишена опции Advanced Settings. Версия для продвинутых пользователей предлагается чуть дешевле $300 и позволяет управлять режимом обновления. Непременное замечание о том, что правильные установки по плечу только квалифицированному инженеру, касается такой важной области, как DMI, и особенно идентификатора UUID (Universal Unique ID), в чьи "обязанности" входит обслуживание загрузки с FireWire (IEEE 1394).

Для обновления BIOS не требуется ничего, кроме файла BIOS.WPH, -- все опции размещены во встроенном в него "наследнике" PLATFORM.BIN. Цель, к которой инженеры Phoenix шли многие годы, достигнута.


Плюсы и минусы

Нельзя пройти мимо очевидных недостатков WinPhlash. Главный из них -- "плавающий" размер файла. Необходимо было бы сохранить размер файла BIOS, кратный степени двойки, что на самом-то деле больше чем традиция (работа с программатором убедит в этом всех и каждого). По всей видимости, с отмиранием приложений, выполняющихся из командной строки, эта задача решится. Структура, аналогичная PLATFORM.BIN, будет размещена в самом теле файла BIOS, а доступ к ней может регулироваться программным продуктом, похожим на нынешний BIOSEdit. Таким образом, будет обеспечена возможность редактирования, что особенно важно для OEM-разработчиков. Другое дело, что для этого требуется выполнить структурную перестройку и изменить ряд системных подходов. Но опыт перехода к версии Phoenix Phlash V1.07 должен многому научить!

Phoenix Phlash -- десять лет в строю
Рис. 5. Редактирование полей DMI
К положительным качествам WinPhlash можно отнести то, что набор действий для операции обновления сведен к минимуму. За это отвечают флаги, полностью соответствующие управляющим ключам Phoenix Phlash. Как и следовало ожидать, графический интерфейс как нельзя более подходит для редактирования структур DMI (рис. 5).

Подводя итоги, можно сказать, что Phoenix Technologies демонстрирует полную готовность поддержать самые современные разработки своего стратегического партнера Microsoft, с которой его связывает почти двадцатилетнее сотрудничество. Но история отношений этих фирм -- тема для другого рассказа.

E-mail автора: [email protected]