Уроки чистописания
Часть 2. На пути к Windows Vista Logo
Следование рекомендациям User Account Protection
Поддержка 64-битных версий Windows Vista
Использование только документированных интерфейсов
Корректная проверка версий операционной системы
Поддержка переключения между задачами
Поддержка работы в режиме нескольких пользователей
Поддержка длинных имен файлов и устройств
Корректная работа в режиме Safe Mode
Следование политикам борьбы с вредоносным ПО
Для установки используйте Windows Components for Installation
Установка не должна требовать прав Local Administrator
Устанавливайте в корректные папки
Подписывайте манифесты ClickOnce
Изолируйте установки ClickOnce
Выполняйте чистую деинсталляцию
Корректно конфигурируйте идентификаторы инсталляционных пакетов
Поддерживайте обслуживание приложений
Корректно устанавливайте ресурсы Windows
Следуйте рекомендациям по созданию расширенных событий в инсталляторах
При установке поддерживайте User Account Protection
Исключайте перезагрузку в процессе установки
Поддерживайте пакетную установку
Следуйте правилам создания компонентов
Устранение лишних перезагрузок
Перезагрузка после принудительного завершения или сбоев
Следование рекомендациям по обработке исключений
В февральском номере нашего журнала (см. «Уроки чистописания. Создание приложений, корректно работающих под Windows XP, Windows Server 2003 и Windows Vista» в № 2’2006) мы представили некоторые рекомендации по написанию корректных приложений, которые работают под управлением текущего поколения операционных систем компании Microsoft — Windows XP и Windows Server 2003, а также будут корректно работать в новой версии операционной системы — Microsoft Windows Vista.
Здесь мы продолжим эту тему и остановимся на основных требованиях, предъявляемых к приложениям, работающим под управлением новой клиентской операционной системы Microsoft Windows Vista и претендующим на получение логотипа Windows Vista Logo. Соблюдение этих требований способствует улучшению качества приложений, работающих на платформе Windows, обеспечению их совместимости, надежности и безопасности, а также позволит компаниям — разработчикам программного обеспечения при необходимости успешно пройти тесты на получение логотипа Windows Vista Logo.
Требования, выдвигаемые к приложениям, претендующим на получение логотипа Windows Vista Logo, а также ко всем приложениям, которые должны работать под управлением операционной системы Microsoft Windows Vista, можно разделить на три основные категории: безопасность и совместимость; установка; надежность работы.
Ниже мы более подробно рассмотрим требования, входящие в каждую из этих категорий. Как уже отмечалось в первой части статьи, настоятельно рекомендуется изучить каждое из этих требований и, по возможности, включить их в соответствующие разделы проектной документации к разрабатываемому приложению — таким образом они будут учтены и при написании кода приложения, и при его тестировании. Учет этих требований позволит в дальнейшем гарантировать вашим приложениям надежность, стабильность, совместимость с операционной системой и способность предоставлять пользователям тот базовый набор сервисов, которого они традиционно ожидают от программных продуктов, рассчитанных на работу под управлением новых версий клиентских операционных систем.
Безопасность и совместимость
В этой категории собраны требования, удовлетворение которых позволит обеспечить работоспособность приложений в Windows Vista в различных архитектурах, с различными конфигурациями, в различных режимах. Кроме того, приложения, отвечающие данным требованиям, продолжают корректно работать после обновлений операционной системы (при установке пакетов обновлений, выходящих после выпуска основной версии операционной системы). Также гарантируется повышение общей безопасности приложений.
Для начала кратко перечислим требования, относящиеся к категории «Безопасность и совместимость», а затем рассмотрим каждое из них более подробно. К требованиям, включенным в данную категорию, относятся:
- следование рекомендациям User Account Protection;
- поддержка 64-разрядных версий Windows Vista;
- наличие подписанных файлов;
- наличие подписанных драйверов;
- использование только документированных интерфейсов;
- корректная проверка версий операционной системы;
- поддержка переключения между задачами;
- поддержка работы в режиме нескольких пользователей;
- поддержка длинных имен файлов и устройств;
- корректная работа в режиме Safe Mode;
- следование политикам борьбы с вредоносным ПО.
Следование рекомендациям User Account Protection
Как известно, наиболее безопасный режим выполнения приложений — использование того уровня привилегий, который реально требуется для обеспечения их полноценной функциональности. За исключением тех случаев, когда приложение предназначено для системных администраторов, оно должно выполняться с минимальными привилегиями.
Каждое приложение должно содержать встроенный манифест, в котором задается уровень выполнения приложения:
<requestedExecutionLevel level=”asInvoker|highestAvailable|requireAdministrator” uiAccess=”true|false”/>
Для большинства приложений уровень должен быть установлен в asInvoker. Также подавляющее большинство приложений не должно управлять интерфейсом других приложений, поэтому атрибут uiAccess должен иметь значение false.
Поддержка 64-битных версий Windows Vista
Приложения, предполагаемые к использованию под управлением операционной системы Windows Vista, должны поддерживать 64-разрядную версию этой операционной системы. Это означает, что приложения и их программы установки не должны содержать 16-разрядного кода или зависеть от 16-разрядных компонентов. Если приложение использует какие-либо драйверы, то должны поставляться 64-разрядные версии соответствующих драйверов — программа установки приложения должна определять корректный набор компонентов для 64-разрядной версии операционной системы.
Наличие подписанных файлов
Процедура подписания позволяет пользователям убедиться в том, что файлы находятся в целостности, а приложениям дает возможность работать в средах типа locked-down. Все файлы с расширениями *.exe и *.dll должны быть подписаны сертификатом Authenticode. Доступны сертификаты от различных поставщиков (см. список на сайте по адресу http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/rootcertprog.asp). После получения сертификата файлы подписываются утилитой Sign Tool, которая входит в состав Windows SDK (http://windows-sdk.msdn.microsoft.com/library/).
Наличие подписанных драйверов
Поскольку некорректно написанные драйверы могут негативно повлиять на стабильность и безопасность системы, все драйверы уровня kernel-, требуемые для выполнения того или иного приложения, должны быть подписаны сертификатом Microsoft, который доступен через программы WHQL или DRS (дополнительная информация о подписании драйверов доступна на сайте http://www.microsoft.com/whdc/winlogo/hwrequirements.mspx).
Использование только документированных интерфейсов
Неподдерживаемые и недокументированные программные интерфейсы с высокой долей вероятности могут измениться или быть исключены в очередных версиях операционной системы. Поэтому приложения не должны использовать устаревшие программные интерфейсы и недокументированные внутренние функции операционной системы. Помимо этого не должны использоваться интерфейсы, помеченные в Visual Studio 2005 как Obsolete.
Корректная проверка версий операционной системы
Приложения должны корректно работать при изменении номеров версий операционной системы. Исключение составляют те случаи, когда в лицензионном соглашении в явном виде сказано, что приложение не поддерживает будущие версии операционных систем. Для проверки версии операционной системы следует использовать только рекомендованные документированные функции Windows API; проверка версии операционной системы через записи реестра не допускается.
Поддержка переключения между задачами
В приложениях должно корректно отрабатываться переключение между задачами и не должна блокироваться функциональность ALT+TAB или других сценариев переключения между задачами.
Поддержка работы в режиме нескольких пользователей
Приложения должны корректно работать в режиме нескольких пользователей, то есть работать в параллельных сессиях без конфликтов и сбоев. К основным требованиям относятся: воспроизведение приложением звука только в данной сессии, отсутствие зависимости от глобально названных объектов, а также отказ от эксклюзивного доступа к системным и пользовательским ресурсам без крайней необходимости (например, требование не использовать блокировку чтения/записи для операций «только чтение»).
Поддержка длинных имен файлов и устройств
Приложения должны корректно работать с длинными именами файлов, папок, пользователей, устройств и ключей реестра. Приложения должны поддерживать максимальную длину имен, определенную в Platform SDK.
Корректная работа в режиме Safe Mode
Режим Safe Mode позволяет пользователям диагностировать и корректировать конфигурации Windows. Поддержка работы в этом режиме гарантирует, что пользователям будет доступна вся функциональность приложения без зависаний и сбоев. Любые некритичные сервисы по умолчанию не должны запускаться в режиме Safe Mode. К некритичным сервисам относятся сервисы, от которых не зависит широкий класс приложений и сервисов, например сервис RemoteRegistry. Приложения, которым требуются сервисы, не доступные в режиме Safe Mode, должны корректно завершать свою работу с соответствующим сообщением и с записью необходимой информации в системный протокол.
Следование политикам борьбы с вредоносным ПО
Приложения должны следовать рекомендациям Anti-Spyware Coalition (http://www.anti-spywarecoalition.org/documents/index.htm). Приложения, претендующие на получение логотипа, проходят дополнительную проверку в Microsoft и заносятся в специальный каталог, содержащий список всех корректных приложений.
Установка
В этой категории собраны требования, удовлетворение которых позволит пользователям быть уверенными, что приложения будут установлены под Windows без необходимости изменений настроек операционной системы и без конфликтов с другими приложениями. Эти требования следующие:
- для установки используйте Windows Components for Installation;
- установка не должна требовать прав Local Administrator;
- устанавливайте в корректные папки;
- подписывайте манифесты ClickOnce;
- изолируйте установки ClickOnce;
- выполняйте «чистую» деинсталляцию;
- корректно конфигурируйте идентификаторы инсталляционных пакетов;
- поддерживайте обслуживание приложений;
- корректно устанавливайте ресурсы Windows;
- следуйте рекомендациям по созданию расширенных событий в инсталляторах;
- при установке поддерживайте User Account Protection;
- исключайте перезагрузку в процессе установки;
- поддерживайте пакетную установку;
- следуйте правилам создания компонентов.
Рассмотрим требования по установке приложений более подробно.
Для установки используйте Windows Components for Installation
Для реализации программ установки программного обеспечения рекомендуется использовать соответствующие компоненты операционной системы — Windows Components for Installation. С их помощью легко создавать удобные, транзакционные инсталляторы с возможностью отмены произведенных операций. Приложения должны пользоваться сервисами Windows Installer (MSI) или ClickOnce. Созданные инсталляционные пакеты не должны получать ошибки от Internal Consistence Evaluators.
Установка не должна требовать прав Local Administrator
Программа установки программного обеспечения не должна подразумевать, что пользователь обладает правами локального администратора. Более того, программа установки должна работать так, чтобы она могла быть завершена не тем пользователем, который ее запустил. Если процесс установки запущен пользователем с правами Standard User или Protected Administrator, то процесс установки должен корректно обработать переход на полные администраторские права. Все действия, происходившие до этого перехода, должны выполняться с правами Standard User.
Устанавливайте в корректные папки
Пользователи должны иметь возможность гибкого выбора места установки программного обеспечения и места хранения файлов по умолчанию. По умолчанию приложения должны устанавливаться в папку Program Files или в пользовательскую папку AppData. Данные должны записываться при первом запуске приложения, а не при его установке — это связано с тем, что при установке возможно переключение пользователей и при этом нельзя корректно определить местоположение пользовательских данных.
Подписывайте манифесты ClickOnce
Поскольку приложения, устанавливаемые сервисами ClickOnce, могут разворачиваться из внешних, по отношению к локальному компьютеру, источников, пользователи должны иметь возможность убедиться в том, что такие приложения работают корректно. Для этого необходимо, чтобы все приложения были подписаны сертификатом Authenticode.
Изолируйте установки ClickOnce
Приложения, устанавливаемые сервисами ClickOnce, должны минимально воздействовать на систему. Такие приложения должны хранить данные только в пользовательских папках и, по возможности, не изменять ключи реестра.
Выполняйте чистую деинсталляцию
Чистая деинсталляция приложений существенно облегчает поддержку операционной системы и в ряде случаев может улучшить производительность всей системы. Приложения должны корректно и полностью удаляться с компьютера. Процесс деинсталляции включает удаление файлов, ключей реестра, сборок из GAC, таблиц баз данных, настроек метабазы, записей в Active Direсtory и т.п.
Корректно конфигурируйте идентификаторы инсталляционных пакетов
Корректная идентификация инсталляционных пакетов упрощает пользователям управление приложениями при их обслуживании и обновлении или при обновлении всей операционной системы. Помимо этого идентификация инсталляционных пакетов существенно упрощает процесс удаления приложений средствами Software Explorer (в предыдущих версиях операционной системы — Add/Remove Programs). Пакет должен содержать заполненные соответствующими данными свойства ProductName, Manufacturer и ProductVersion.
Поддерживайте обслуживание приложений
Для поддержки обновлений приложений пакеты Windows Installer должны включать сертификат обновления в таблице MsiPathCertificate. Если обновления подписаны таким сертификатом, то приложения могут обновляться автоматически, без привлечения администратора.
Корректно устанавливайте ресурсы Windows
Механизмы Windows Resource Protection (WRP) гарантируют, что защищенные системные ресурсы обновляются только одобренными Microsoft средствами и соответствующими механизмами. Приложения не должны устанавливать файлы, защищенные WRP. Если приложению требуется новая версия системного компонента, то эти компоненты должны устанавливаться на компьютер средствами Microsoft Service Pack или через предоставляемый Microsoft инсталляционный пакет, содержащий требуемый программный компонент.
Следуйте рекомендациям по созданию расширенных событий в инсталляторах
Расширенные события в пакетах инсталляции предоставляют разработчикам широкие возможности по расширению функциональности программ установки. При использовании механизмов расширений следует придерживаться следующих правил:
- все расширения должны быть документированы;
- разработчики не должны добавлять новые колонки в стандартные таблицы — формат таблиц может измениться в новых версиях Windows Installer;
- из расширений не должна вызываться утилита gacutil, поскольку она не рассчитана на использование внутри инсталляционных пакетов;
- успех или ошибка при выполнении расширенного события должны записываться в протокол с применением средств MsiProcessessage, а не стандартных кодов завершения операций;
- новые колонки или свойства не должны иметь префикс msi;
- расширенные события, изменяющие состояние системы, должны восстанавливать его по завершении работы инсталляционного пакета;
- расширенные события, изменяющие состояние системы, должны быть парой deferred/rollback.
При установке поддерживайте User Account Protection
В операционной системе Windows Vista механизмы User Account Protection по умолчанию включены. Программы установки программного обеспечения должны соответствующим образом управлять требованиями к уровням привилегий. Приложения должны содержать манифест, в котором указан требуемый уровень привилегий для их установки. Если приложение запускается сразу же после установки, оно должно корректно выполняться с тем уровнем привилегий, который использовался для запуска программы установки.
Исключайте перезагрузку в процессе установки
Ни при каких установках программного обеспечения не должна использоваться опция ForceReboot Windows Installer. В диалоговых панелях Files In Use должна быть опция Automatically Close Applications and Attempt to Restart After Setup is Complete. Эта дополнительная функциональность позволит избежать перенагрузок через инфраструктуру Restart Manager.
Поддерживайте пакетную установку
Наличие обязательного пользовательского интерфейса может помешать реализации некоторых сценариев установки. Все приложения должны поддерживать пакетную установку из командной строки. Приложения должны устанавливаться в режиме quiet mode (опция командной строки /qn), а также из командной строки с опцией FASTOEM=1.
Следуйте правилам создания компонентов
Для того чтобы установка или удаление одного приложения не влияли на другие приложения, а также для того чтобы гарантировать, что сервисы Windows Installer корректно удалят все ресурсы, связанные с приложением, необходимо выполнять следующие правила:
- поля ComponentId в таблице Components должны быть ненулевыми — в противном случае компоненты не будут удалены средствами Windows Installer;
- не используйте более одного COM-сервера на компонент — если компонент содержит COM-сервер, он должен выполнять роль KeyPath для компонента;
- не указывайте более одного файла в качестве элемента меню Start или ссылки на рабочем столе на компонент.
Надежность работы
Следование этим требованиям повышает надежность приложений, снижает число сбоев, зависаний, перезагрузок, приложения становятся более предсказуемыми и управляемыми. К требованиям, входящим в категорию «Надежность работы», относятся:
- устранение лишних перезагрузок;
- перезагрузка после принудительного завершения или сбоев;
- устранение сбоев приложений;
- следование рекомендациям по обработке исключений;
- стабильная работа приложений.
Рассмотрим эти требования более подробно.
Устранение лишних перезагрузок
Не секрет, что необходимость в лишней перезагрузке компьютера вызывает у пользователей раздражение, приводит к снижению продуктивности и к потерям времени. Приложения, выполняющиеся под управлением Windows Vista, могут использовать функциональность компонента Windows Vista Restart Manager для того, чтобы зарегистрировать необходимость перезагрузки и слушать соответствующие сообщения ядра операционной системы (WM_QUERYENDSESSION и WM_ENDSESSION). Для установки приложений должна использоваться утилита Windows Installer (см. выше), а для доступа к Restart Manager API — механизм расширенных событий Windows Installer.
Перезагрузка после принудительного завершения или сбоев
Возможность повторного запуска приложений после их принудительного завершения или сбоя — отличный способ улучшить пользовательское мнение о том или ином программном продукте. За счет сохранения данных и состояния приложение может свести к минимуму потери, связанные со сбоями. Все приложения должны содержать сведения о том, как они могут быть повторно загружены после автоматического принудительного завершения — для этого используются программные интерфейсы RegisterApplicationRestart, реализованные в ядре операционной системы. Предполагается, что приложения сохраняют данные и состояние перед принудительным завершением. Соответствующие опции командной строки должны позволять восстановить состояние приложения на момент его принудительного завершения, а также и имеющиеся данные. После повторного запуска приложение должно отобразить этот факт в своем интерфейсе. На уровне операционной системы поддержка перезапуска приложений реализована в компоненте Service Control Manager (SCM), управление настройками которого позволит разработчикам указать число попыток при перезапуске приложений, задержку между повторными перезапусками и т.п.
Устранение сбоев приложений
Тщательное тестирование приложений как собственными средствами, так и с помощью сценариев, предоставляемых в рамках пакета Windows Application Verifier (это доступно на Microsoft Download Center — www.microsoft. com/downloads), позволит разработчикам свести к минимуму ситуации, приводящие к сбоям в работе приложений. Тесты, входящие в состав Windows Application Verifier, используются для проверки совместимости приложений с требованиями Windows Vista Logo и включают проверку заполнения «кучи», нарушений доступа (в том числе переполнение буфера), проблемы с обработкой критических секций, попытки использования недопустимых ссылок, ошибки TLS-индексов, проблемы с использованием виртуальной памяти и ошибки, связанные с обработкой исключений.
Большинство сбоев приложений можно предотвратить, если приложение разрешит пользователям останавливать операции ввода-вывода и другие операции, способные заблокировать приложение без необходимости аварийного завершения процесса. Улучшенные механизмы остановки операций ввода-вывода, поддерживаемые в Windows Vista, включают программные интерфейсы CancelSynchronousIo, которые позволяют отменять вызовы синхронных операций ввода-вывода (OpenFile, GetFileAttributes и т.п.). Поскольку эти программные интерфейсы должны вызываться из другого потока, то приложения, поддерживающие механизмы отмены операций ввода-вывода, должны быть многопоточными. Еще одно добавление к программным интерфейсам, появившееся в Windows Vista, — это интерфейс CancelIoEx, позволяющий отменить все стоящие в очереди операции ввода-вывода для указанного файла.
Следование рекомендациям по обработке исключений
После возникновения некоторых критических исключений (например, после нарушения прав доступа — access violation) приложение может перейти в состояние, в котором его дальнейшее выполнение не имеет смысла. Например, могут быть разрушены некоторые важные структуры, включая «кучу» процесса или его структуры данных. В этом случае дальнейшее выполнение приложения может привести к искажению или к потере данных.
Рекомендации по обработке исключений таковы:
- обрабатывайте только известные и ожидаемые исключения — приложение не должно пытаться обработать глобальные исключения, установить соответствующие фильтры; в частности приложение не должно использовать функцию SetUnhandledExceptionFilter для фатальных исключений;
- не допускайте завершения операционной системой приложения без соответствующих уведомлений пользователей — приложение не должно вызывать функцию SetErrorMode с параметром SEM_NOGPFAULTERRORBOX для завершения средствами операционной системы, за исключением тех случаев, когда приложение содержит фильтр для корректной обработки соответствующего исключения.
Общая рекомендация сводится к проверке использования в приложении функций SetUnhandledExceptionFilter, SetErrorMode, блоков __try и __except для того, чтобы убедиться, что обрабатываются только известные и ожидаемые исключения.
Стабильная работа приложений
В состав ядра Windows Vista входят средства проверки надежности операционной системы, приложений и процессов — Reliability Analysis Component Services (RAC). Сервисы RAC содержат исполняемые файлы агентов, запускаемые через WMI.Jobs. Агенты RAC собирают метрики надежности, базирующиеся на наборе предопределенных задач. Одной из специфичных для процесса метрик является Mean Time To Failure (MTTF) — среднее время до сбоя, которое рассчитывается как общее время работы, деленное на количество сбоев. К сбоям относятся зависания приложений и фатальные сбои в работе приложений. Данные собираются на пользовательских компьютерах (там, где запущены RAC-агенты) и накапливаются в Microsoft. Данные, собранные для конкретного приложения в течение 180 дней, будут использованы для генерации соответствующей MTTF-метрики.
Ресурсы
Ниже перечислен ряд ресурсов, обратившись к которым можно получить дополнительную информацию по темам, рассмотренным в данной статье.
- Windows Vista SDK: http://windowssdk.msdn.microsoft.com/library;
- User Access Protection Guidelines: http://msdn.microsoft.com/windowsvista/.../AccProtVista.asp;
- ClickOnce: http://msdn.microsoft.com/clickonce;
- Windows Installer: http://go.microsoft.com/fwlink/?LinkId=3985;
- Developer Portal: https://winqual.microsoft.com/member/wer/user/default.aspx