Windows 7: Теперь все устройства доступны в два щелчка

Device Stage для флешки своими руками

Автор: Бойко Алексей
Источник: RSDN Magazine #4-2010
Опубликовано: 05.02.2011
Версия текста: 1.1
Введение
Как это работает
Откуда Windows берет информацию об устройстве
Как Windows сопоставляет файл описания и устройство
Hardware ID
Model ID
Шаг 0: Подготовительные работы
Узнаем Hardware ID флешки
XSD-схемы
CABARC.EXE
Шаг 1: Меняем иконку в папке “Устройства и принтеры”
Структура архива .devicemetadata-ms
PackageInfo.xml
WindowsInfo.xml
DeviceInfo.xml
Создание архива .devicemetadata-ms
Шаг 2: Простой Device Stage
Изменения в PackageInfo.xml
Behavior.xml и Resource.xml
Шаг 3: Выводим текущие параметры устройства
Шаг 4: Задачи
Что дальше
Ссылки

Исходники к статье

Введение

Данная статья посвящена сразу двум нововведениям в Windows 7, облегчающим работу с телефонами, принтерами, плеерами и другим оборудованием. Речь о новой папке “Устройства и принтеры” и страницах Device Stage.

Теперь все устройства собраны в одном месте и доступны в два щелчка: “Пуск” -> “Устройства и принтеры”. Устройства отображаются фотореалистичными иконками, так что нам даже не надо знать, как они называются. Двойной щелчок по иконке откроет страницу Device Stage, на которой представлены основные функции и параметры устройства. Отметим, что папка “Устройства и принтеры” и Device Stage – это именно две (а не одна) возможности, дополняющие друг друга. Почти все оборудование отображается в “Устройствах и принтерах”, но не у каждого есть страница Device Stage.

Для знакомства с новшествами будем использовать обычную флешку. За четыре шага, постепенно усложняя пример, мы создадим полноценную страницу Device Stage. Каждый шаг - это готовое к использованию, реально работающее решение. К статье прилагаются четыре папки, по одной на шаг.

Как это работает

Откуда Windows берет информацию об устройстве

Для хранения иконок и информации об оборудовании в Windows появилась специальная папка – DeviceMetadataStore. Когда мы подключаем к компьютеру свой плеер или телефон, система находит в ней соответствующий .devicemetadata-ms-файл с описанием.

devicemetadata-ms-файлы автоматически загружаются с сервера Microsoft, но их можно положить в папку %PROGRAMDATA%\Microsoft\Windows\DeviceMetadataStore и вручную.

Файлы описания создаются разработчиками устройств и передаются Microsoft. Перед размещением на сервере Microsoft проверяет, помечает и подписывает полученные файлы.

ПРИМЕЧАНИЕ

Обратите внимание, Microsoft помечает и подписывает файлы описания. Позже мы к этому вернемся.

На самом деле, файл .devicemetadata-ms – это архив. Чтобы посмотреть его содержимое, нужно поменять разрешение на .cab. Чуть позже мы подробно рассмотрим содержимое таких архивов (собственно, этому-то и посвящена статья).

Как Windows сопоставляет файл описания и устройство

Какой именно файл соответствует данному устройству, система определяет с помощью:

Hardware ID

Любое оборудование, совместимое с Windows, при подключении сообщает системе один или несколько идентификаторов Hardware ID. С помощью этих идентификаторов Windows определяет, какой драйвер нужно использовать для устройства. Теперь Hardware ID применяется и для поиска соответствующего devicemetadata-ms-файла.

В некоторых случаях такой способ связи устройства c файлом описания подходит, а в некоторых – нет. Причина в том, что разные устройства могут использовать один и тот же драйвер, и, соответственно, сообщать один и тот же Hardware ID. Простой пример: новая модель телефона использует тот же драйвер, что и старая. Пользователю гораздо приятнее будет увидеть иконку с изображением своего нового телефона. И это действительно важно, ведь мы говорим о нововведениях, призванных упростить и сделать приятной работу пользователя. Какой смысл в фотореалистичной иконке, если на ней изображен другой аппарат? Коллега на работе радовался как ребенок, когда его новая красивая красная мышка от Microsoft отобразилась в папке “Устройства и принтеры” иконкой именно красного цвета. А ведь мышка выпускается в шести цветовых вариантах. Тут мы подошли к новому способу идентификации оборудования – Model ID.

Model ID

Model ID – это новый способ идентификации устройств, появившийся в Windows 7. Model ID не используется для поиска драйверов, а значит, не служит заменой Hardware ID. Устройству можно назначить только один Model ID. Конечно, старые устройства не имеют Model ID и не сообщают его при подключении, но в новые модели производители могут добавить эту возможность.

ПРИМЕЧАНИЕ

Еще один пример того, насколько сильно Windows 7 отличается от предшественников. Новая система идентификации устройств, затрагивающая производителей - это не шутки.

В зависимости от выбора разработчика, в файле описания указывается или список Model ID, или список Hardware ID тех устройств, к которым относится файл.

Шаг 0: Подготовительные работы

Подведем промежуточный итог и набросаем краткий план действий. Сейчас наша флешка отображается в папке “Устройства и принтеры” иконкой по умолчанию, никакой специфической информации об устройстве не выводится (рисунок 1).


Рисунок 1. Отображение флешки в папке “Устройства и принтеры” по умолчанию

Чтобы Windows могла показать более полные данные о флешке, нужно:

  1. узнать Hardware ID (или Model ID) флешки;
  2. подготовить файл описания;
  3. скопировать файл описания в папку DeviceMetadataStore.

Узнаем Hardware ID флешки

В нашем случае выбор между Hardware ID или Model ID совершенно непринципиален. Возьмем Hardware ID, так как у любой флешки он точно есть.

Чтобы узнать Hardware ID, нужно: в папке “Устройства и принтеры” щелкнуть правой кнопкой мыши по иконке флешки -> Свойства -> вкладка Оборудование -> тип Дисковые устройства -> кнопка Свойства -> в новом окне вкладка Сведения -> в выпадающем списке Свойство : ИД оборудования (рисунок 2).


Рисунок 2. Список Hardware ID

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

XSD-схемы

Как уже говорилось, файл .devicemetadata-ms – это на самом деле архив. Этот архив содержит только XML-файлы и картинки, разложенные по подпапкам. Все описывается с помощью XML, так что нам придется много с ним работать. Оставим возню с разными видами блокнотов школьникам и любителям “альтернативных решений”. Мы-то знаем, что ничего лучше Visual Studio не придумали - остается только добавить нужные XSD схемы в папку ..\Visual Studio\Xml\Schemas

Что бы получить XSD-схемы, нужно установить “Microsoft Device Experience Development Kit” (см. ссылки в конце статьи). Схемы находятся в каталоге ..\Microsoft Device Experience Development Kit 7R2\General\XML Schemas\

CABARC.EXE

Для создания файлов .devicemetadata-ms нужна утилита CABARC.EXE. Отдельно её скачать нельзя, она идет в комплекте с “Device Stage Visual Editor Tool”. Да, да, для изготовления страниц Device Stage есть GUI-приложение. Но его мы использовать не будем. И не потому, что нам чужд комфорт, или мы презираем все, чем могут пользоваться непосвященные непрограммисты (как это часто делают ярые воинствующие поклонники не-Windows-систем). Просто работа “вручную“ даст нам больше гибкости и лучшее понимание процесса.

Шаг 1: Меняем иконку в папке “Устройства и принтеры”

В первом шаге мы создадим самый простой файл описания, не использующий возможности Device Stage. Нет никакой необходимости приводить в тексте статьи полные листинги XML-файлов – файлы для первого шага можно найти в папке “example1”, прилагаемой к статье. Поэтому в листингах будут показаны только те части, на которые нужно обратить внимание, самое главное выделено.

Структура архива .devicemetadata-ms

На рисунке 3 представлена структура архива .devicemetadata-ms. В качестве названия архива должен использоваться глобальный уникальный идентификатор (GUID). Например: 0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms.


Рисунок 3. Структура архива .devicemetadata-ms, не поддерживающего Device Stage

Из рисунка 3 видно, что нужно создать три XML-файла (PackageInfo.xml, DeviceInfo.xml, WindowsInfo.xml) и одну иконку.

PackageInfo.xml

Как и следует из названия, этот файл используется для описания .devicemetadata-ms-пакета (файла описания). В нем указывается такая информация, как время создания пакета, используемые XML-схемы, локализация по умолчанию. Но самое главное – там указывается список Hardware ID (или список Model ID), c которыми связан пакет.

Листинг 1. PackageInfo.xml
<?xmlversion="1.0"encoding="utf-8" standalone="yes"?>
<PackageInfo xmlns="...">
  <MetadataKey>
    <HardwareIDList>
      <HardwareID>DOID:USBSTOR\Disk-Pretec_01GB____________2.00</HardwareID>
    </HardwareIDList>
    <Locale default="true">en-US</Locale>
    <LastModifiedDate>2011-07-02T23:22:09Z</LastModifiedDate>
  </MetadataKey>
  <PackageStructure>
    <Metadata MetadataID="...">PackageInfo.xml</Metadata>
    <Metadata MetadataID="...">DeviceInformation</Metadata>
    <Metadata MetadataID="...">WindowsInformation</Metadata>
  </PackageStructure>
</PackageInfo>

Обратите внимание на приставку “DOID”, которую нужно указать перед Hardware ID. Есть еще приставка “SFDOID” (Single Function Device), но она сейчас не используется и зарезервирована для будущих версий Windows. Эти приставки указывают на то, сколько функций выполняет устройство – одну или несколько. Например, часто встречаются многофункциональные устройства, сочетающие в себе принтер, факс и сканер. Чуть позже мы еще раз поговорим о функциях устройства.

WindowsInfo.xml

Здесь описываются правила отображения иконки и страницы Device Stage.

Листинг 2. WindowsInfo.xml
<?xmlversion="1.0"encoding="utf-8" standalone="yes"?>
<WindowsInfo xmlns="...">
  <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState>
  <LaunchDeviceStageOnDeviceConnect>false</LaunchDeviceStageOnDeviceConnect>
  <LaunchDeviceStageFromExplorer>false</LaunchDeviceStageFromExplorer>
</WindowsInfo>

ShowDeviceInDisconnectedState – показывать устройство в папке “Устройства и принтеры”, когда устройство не подключено. Иконка неподключенного устройства будет более бледной (см. рисунок 1). Кстати, задать свою отдельную иконку для отключенного состояния оборудования нельзя.

LaunchDeviceStageOnDeviceConnect – открывать страницу Device Stage автоматически при подключении устройства.

LaunchDeviceStageFromExplorer – открывать Device Stage по двойному щелчку по иконке.

DeviceInfo.xml

Лучше один раз увидеть, чем сто раз услышать (рисунок 4).


Рисунок 4. Описание DeviceInfo.xml

Рисунок 4 говорит сам за себя. Стоит отметить только узел DeviceCategory, который в нашем случае указывает на то, что устройство – это флешка. Если устройство – многофункциональное, можно указать несколько категорий (например, принтер часто является и сканером). Помните, выше, когда описывали PackageInfo.xml, мы упоминали приставки “DOID” и “SFDOID”?

Первый узел DeviceCategory указывает на главную категорию – устройство, сочетающее в себе и принтер и сканер, чаще всего называют “принтером со встроенным сканером”, но не “сканером со встроенным принтером”.

ПРИМЕЧАНИЕ

Как-то мне пришлось вступить в спор с вполне авторитетными товарищами, которые утверждали, что XML – это что-то вроде таблицы в базе данных. Т.е. порядок следования XML-узлов точно так же непринципиален, как и порядок строк в таблице. Но мы знаем, что в XML порядок следования узлов может иметь значение.

Полный список категорий с пояснениями находится в документе “How to Create a Device Metadata Package for Devices and Printers”.

Создание архива .devicemetadata-ms

Теперь у нас есть все необходимые файлы (опустим процесс получения иконки). Создадим следующую структуру директорий (листинг 3):

Листинг 3. Структура директорий для создания архива .devicemetadata-ms
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\PackageInfo.xml
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\DeviceInformation\DeviceInfo.xml
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\DeviceInformation\i_disk_wave_black.ico
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\WindowsInformation\WindowsInfo.xml

Запускаем CABARC.EXE (листинг 4).

Листинг 4. Вызов CABARC.EXE (все в одну строку без переносов)
Cabarc.exe -r -p -P .\0055f9a7-ffef-4017-be40-e1e118fa4e86\ N 
.\0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms 
.\0055f9a7-ffef-4017-be40-e1e118fa4e86\*.*

Копируем 0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms в DeviceMetadataStore.

Шаг 2: Простой Device Stage

Во втором шаге мы доработаем пример так, что при двойном щелчке по иконке будет открываться простая страница Device Stage. Готовый пакет находится в папке “example2”.

В структуре архива .devicemetadata-ms появится новая папка DeviceStage (рисунок 5).


Рисунок 5. Структура архива .devicemetadata-ms, поддерживающего Device Stage

Прежде всего подредактируем WindowsInfo.xml, чтобы по двойному щелчку по иконке открывалась страница Device Stage.

Листинг 5. Изменения в WindowsInfo.xml для поддержки Device Stage
<?xmlversion="1.0"encoding="utf-8" standalone="yes"?>
<WindowsInfo xmlns="...">
 <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState>
 <LaunchDeviceStageOnDeviceConnect>false</LaunchDeviceStageOnDeviceConnect>
 <LaunchDeviceStageFromExplorer>true</LaunchDeviceStageFromExplorer>
</WindowsInfo>

Изменения в PackageInfo.xml

Нужно также внести изменения и в PackageInfo.xml (листинг 6).

Листинг 6. Изменения в PackageInfo.xml для поддержки Device Stage
<?xmlversion="1.0"encoding="utf-8" standalone="yes"?>
<PackageInfo xmlns="...">
  ...
  <PackageStructure>
    <Metadata MetadataID="...">PackageInfo.xml</Metadata>
    <Metadata MetadataID="...">DeviceInformation</Metadata>
    <Metadata MetadataID="...">WindowsInformation</Metadata>
    <Metadata MetadataID="...">DeviceStage</Metadata>
  </PackageStructure>
  <Relationships>    <ExperienceID>E129DCA4-8767-425D-B7A5-EC179393BEF4</ExperienceID>  </Relationships>
</PackageInfo>

Добавилась еще одна Metadata, но это неинтересно. Обратить внимание стоит на узел ExperienceID. Помните, в начале статьи мы говорили о том, что Microsoft помечает и подписывает .devicemetadata-ms-файлы (см. раздел “Откуда Windows берет информацию об устройстве”)? Узел ExperienceID и есть та самая метка, которую выставляет Microsoft. Для экспериментов мы подставили произвольный GUID. Конечно, подставить GUID самостоятельно без Microsoft мы можем, а вот подписать пакет без Microsoft не получится.

ПРИМЕЧАНИЕ

В “легальных” архивах .devicemetadata-ms находится файл с подписью - sign.cat.

И тут нас ждет небольшое разочарование. Чтобы наш неподписанный файл описания был принят системой, нужно перейти в тестовый режим (листинг 7).

Листинг 7. Переход в тестовый режим. Требуется перезагрузка.
Bcdedit -set testsigning ON

Behavior.xml и Resource.xml

Behavior.xml описывает внешний вид страницы Device Stage и то, какие функции на ней будут представлены (рисунок 6).


Рисунок 6. Описание Behavior.xml

В странице Device Stage мы использовали не все предусмотренные стилистические возможности.

Отметим, что значение атрибута ExperienceID должно совпадать со значением одноименного узла в файле PackageInfo.xml.

В узле taskCategoryMapping перечисляются доступные задачи. В нашем примере указана одна задача – “Просмотр файлов”. Более подробно задачи мы рассмотрим в четвертом шаге.

Текст строк маркированного списка (узел marketingBullets) указывается в Resource.xml и связывается с помощью атрибута id узлов bullet (листинг 8).

Листинг 8. Resource.xml
<?xmlversion="1.0"encoding="utf-8"?>
<stringTable xmlns="...">
  <string id="bullet1">Example for RSDN</string>
  <string id="bullet2">RSDN Group and Microsoft contest</string>
</stringTable>

Создаем архив .devicemetadata-ms, входим в тестовый режим, копируем архив в DeviceMetadataStore, радуемся.

Шаг 3: Выводим текущие параметры устройства

В шапке Device Stage взамен маркированного списка (см. рисунок 6) можно выводить до 6 текущих параметров устройства, например, уровень заряда батареи и количество свободного места. Батареи во флешке нет, поэтому будем довольствоваться выводом информации о свободном месте (рисунок 7).


Рисунок 7. Вывод информации о свободном месте

Внесем дополнения в Behavior.xml (листинг 9).

Листинг 9. Изменения в Behavior.xml для вывода информации о свободном месте
<?xmlversion="1.0"encoding="utf-8"?>
<deviceBehavior xmlns="...">
    ...
  <statusItems statusProvider="{c2dae44d-c850-425c-b466-d8cbc1469f5d}"    statusPropList="prop:System.Devices.StorageFreeSpacePercent;">  </statusItems>
</deviceBehavior>

В Windows 7 предусмотрены встроенные возможности по определению текущих параметров подключаемых устройств. Для их использования нужно знать идентификатор statusProvider-а и названия свойств. Ну и конечно, нужно, чтобы устройство поддерживало такую возможность. Можно создавать свои собственные статусы – интересная тема, но и объемная. Придется отложить её для будущих статей. Тут отметим только, что информацию о встроенных statusProvider-ах можно найти в “Microsoft Device Experience Development Kit”. Например, используемый нами statusProvider {c2dae44d-c850-425c-b466-d8cbc1469f5d} описан в документе “Windows 7 Device Stage Portable Devices Development Guide”.

Еще немного доработаем пример. Пусть по щелчку по статусу (информации о свободном месте) будет открываться содержимое флешки, т.е. будет выполняться задача “Просмотр файлов”, о которой мы уже говорили в “Шаге 2”. Посмотрите на листинг 10.

Листинг 10. Выполнение задачи по щелчку по статусу
<?xmlversion="1.0"encoding="utf-8"?>
<deviceBehavior xmlns="...">
  ...
  <taskCategoryMapping>
    <taskRef taskGroupGuid="{07deb856-fc6e-4fb9-8add-d8f2cf8722c9}" 
      taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}" />
  </taskCategoryMapping>
  <statusItems statusProvider="{c2dae44d-c850-425c-b466-d8cbc1469f5d}"
      statusPropList="prop:System.Devices.StorageFreeSpacePercent;">
    <statusLinks>      <statusLink statusProp="System.Devices.StorageFreeSpacePercent"          taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}"/>    </statusLinks>
  </statusItems>
</deviceBehavior>

Задача должна быть обязательно указана и в узле taskCategoryMapping, то есть нельзя повесить задачу на статус и при этом не вывести её повторно среди списка всех доступных задач.

Чтобы иконка устройства отображалась на панели задач, как на рисунке 7 справа, нужно отредактировать WindowsInfo.xml – листинг 11.

Листинг 11. Включаем иконку на панели задач. WindowsInfo.xml
<?xmlversion="1.0"encoding="utf-8" standalone="yes"?>
<WindowsInfo xmlns="...">
  <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState>
  <LaunchDeviceStageOnDeviceConnect>true</LaunchDeviceStageOnDeviceConnect>
  <LaunchDeviceStageFromExplorer>true</LaunchDeviceStageFromExplorer>
</WindowsInfo>

Шаг 4: Задачи

Мы уже знаем, что в Windows 7 есть встроенные statusProvider-ы. Также в Windows есть и встроенные задачи. Задачи рассортированы по категориям. Чтобы добавить задачу, нужно знать её GUID и GUID категории (узел taskRef в листинге 10). Можно создавать свои задачи, которые будут открывать сайты и запускать приложения. Кроме того, для самодельных задач можно выставлять условия. Например, сделать так, что задача будет видна, только если компьютер подключен к сети или установлена определенная программа. Можно даже проверять ключи в реестре.

В четвертом шаге мы добавим самодельную задачу, открывающую внутри Device Stage web-страницу (рисунок 8). Задача будет видна, только если есть подключение к интернету.


Рисунок 8. Задача, открывающая web-страницу.

Все задачи должны относиться к какой-нибудь категории. Поэтому вначале нужно её (категорию) создать. Посмотрите на рисунок 9. Там показаны новые элементы в папке DeviceStage нашего архива .devicemetadata-ms.


Рисунок 9. Новые файлы и папки для самодельной задачи

Создать свою категорию задач – это значит создать подпапку для “Task”. При этом название папки должно следовать шаблону: {произвольный GUID} (скобочки обязательны).

Далее нужно подготовить Tasks.xml и Resource.xml (листинг 12).

Листинг 12. Tasks.xml
<?xmlversion="1.0"encoding="utf-8"?>
<taskGroup revocation="false" xmlns="..." 
    taskGroupGuid="{099b7f7d-4d13-4f89-869d-6974ede694b1}">
  <tasks>
    <task id="{1bf99ef2-6b9b-4d9d-832a-cbffd60eb966}" rank="0" 
        issueTime="2010-06-02T10:56:20Z" 
        requiresElevation="false"name="taskName" 
        description="taskDescription" icon="win.ico">
      <requirements>
        <online />
      </requirements>
      <command type="HostedSite">
        <arguments>
          <commandLine>http://www.rsdn.ru</commandLine>
        </arguments>
      </command>
    </task>
  </tasks>
</taskGroup>
Resource.xml
<?xmlversion="1.0"encoding="utf-8"?>
<stringTable xmlns="...">
  <string id="taskName">RSDN</string>
  <string id="taskDescription">Visit RSDN</string>
</stringTable>

В Tasks.xml значение атрибута taskGroupGuid должно совпадать с GUID категории (с названием папки, которую мы создали ниже “Task”). Идентификатор задачи (атрибут id узла task) – это произвольный GUID, заключенный в фигурные скобки. Также обратим внимание на необязательный узел requirements. В нем задаются условия отображения задачи. В нашем примере задача требует подключения к Интернет.

Перечислять возможные типы команд (атрибут type узла command) мы не будем – ведь у нас есть Visual Studio с подключенными XSD-схемами, которая выводит всплывающие подсказки. Вроде бы дополнительных пояснений листинг 12 не требует.

Все готово, остается только добавить задачу в behavior.xml. Из листинга 13 видно, что самодельная задача добавляется точно так же, как встроенная в Windows.

Листинг 13. Behavior.xml. Самодельные задачи добавляются так же, как встроенные в Windows
<?xmlversion="1.0"encoding="utf-8"?>
<deviceBehavior xmlns="...">
 ...
  <taskCategoryMapping>
    <taskRef taskGroupGuid="{099b7f7d-4d13-4f89-869d-6974ede694b1}"       taskId="{1bf99ef2-6b9b-4d9d-832a-cbffd60eb966}" />
    <taskRef taskGroupGuid="{07deb856-fc6e-4fb9-8add-d8f2cf8722c9}" 
      taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}" />
  </taskCategoryMapping>
 ...
</deviceBehavior>

Что дальше

Если вы дочитали до этого места – значит меня, как автора, можно поздравить. Еще немного, и издателю пришлось бы делать твердый переплет, а мне – писать благодарности. И все же, статья оставляет больше вопросов, чем дает ответов.

Мы узнали, как организованы новые возможности Windows 7 – папка “Устройства и принтеры” и страницы Device Stage, как система различает устройства, и о том, что в Windows 7 появилась новая система идентификации оборудования по ModelID. А еще нас поджидало разочарование – мы никогда не сможем сделать для своего телефона самую лучшую, самую удобную страницу Device Stage. Вернее, сделать-то сможем, а вот использовать – вряд ли, не будем же мы все время сидеть в тестовом режиме. Нам остается только довольствоваться фотореалистичной иконкой – это не требует подписи Microsoft.

ПРИМЕЧАНИЕ

Это действительно очень грустно. Почему у нас нет возможности использовать свои страницы Device Stage? Понятно, что причина этому есть. Но, наверно, можно найти и компромисс. Если вы знаете, как сообщить Microsoft такое предложение, свяжитесь со мной.

По самым скромным прикидкам, за бортом остались:

Нельзя не отметить высокое качество обучающих материалов Microsoft. Описание очень полное, хорошо структурировано и написано понятным языком.

Ссылки

Ссылки на все материалы, упоминающиеся в статье, перечислены на странице “Windows Device Experience” (я же говорил, что информация хорошо структурирована): http://www.microsoft.com/whdc/device/DeviceExperience/default.mspx.


Эта статья опубликована в журнале RSDN Magazine #4-2010. Информацию о журнале можно найти здесь