Встраиваемые системы: Windows специального назначения

Привет!

О могущественные хабрамэн и прекраснейшие хабравимен! Ничтожный заметил, что сура о блистательной Windows Embedded ещё не записана в книге мудрости хабра. Да будет дозволено мне, недостойному, поведать вам одну поучительную историю о том как был построен и внедрён особо пуленепробиваемый Windows ® ™ на объектах одной российской железнодорожной корпорации.

Как мы дошли до жизни такой


Итак, одним утром, в нашу скромную обитель Системного ПО прибыл гонец от программистов с ужасными и печальными новостями. Истинно говорю вам — программцы в командировке не смогли обновить ПО на рабочем месте, т.к. оное обуял шайтан и заселил его вирусами, троянами, порнобаннерами и контерстрайком (сауирщенно неуиновные пользователи были сауирщенно ни при чём).

ПО представляет собой АРМ электромеханика СЦБ, написано на VC++ 6 + MFC + WINAPI.


Наш мудрейший халиф, узнав о таком непотребстве, созвал диван. И так говорили придворные мудрецы и звездочёты:

Антивирус не был установлен по причине отсутствия на станциях интернета (станции раскиданы по всей поверхности России и ездить с офлайн базой для обновления — как-то не вариант). На некоторых станциях есть выход в интранет, где есть корпоративный антивирус, но во-первых: не на всех, во-вторых: антивирус там — хтонический Symantec, старый и добрый.

Спустя некоторое количество служебок, было принято решение заменить десктопный Windows на что-то более прочное и надёжное, но при этом win32-совместимое. Из всей массы подходящих платформ был выбран Windows XP Embedded, т.к. по нему уже имелись наработки да и вообще, классная себе такая система.

Windows XP Embedded — это встраиваемая компонентная операционная система на базе Windows XP Professional Edition и предназначена для применения в различных встраиваемых системах: системах промышленной автоматизации, банкоматах, медицинских приборах, кассовых терминалах, игровых автоматах, VoIP-компонентах и т. п. Windows XP Embedded включает дополнительные функции по встраиванию, среди которых фильтр защиты от записи (EWF и FBWF), загрузка с флеш-памяти, CD-ROM, сети, использование собственной оболочки системы и т. п.

В настоящий момент известна как Windows Embedded Standard.


Windows on steroids


Мы прикинули что можно сделать встроенными средствами IDE Windows Embedded:
  1. запретить запись на диск
  2. ограничить учётку пользователя в правах
  3. лишить пользователя возможности запуска чего-либо кроме АРМ
  4. закрыть неиспользуемые порты
  5. отключить монтирование внешних USB-накопителей
  6. исключить из системы прикладное и системное ПО, не требующееся для непосредственной работы АРМ (Media Player, Outlook Express, Paint, Проводник и т.п.)


Но это всё скучно и просто. Начальство прониклось идеей модульного ПО™, которая заключается в разделении прикладного, системного ПО и конфигурации на «модули» — образы ФС, объединяющие ПО по функциональным признакам. Плюсы такого подхода:

  1. структура ПО становится более упорядоченной
  2. более удобная система версионирования ПО (прошу прощения за этот чудо-термин, лучшего не придумалось)
  3. повышение скорости развёртывания\обновления ПО — большой файл пишется быстрее множества мелких
  4. повышение гибкости системы, например — системное ПО (ОС) можно смонтировать в read-only, не затронув при этом прикладные программы


Очевидных минусов вроде бы нет, казалось бы — внедряй и радуйся. Но то, что для QNX (изначально модульная система разрабатывалась для наших промышленных компьютеров) было просто и естественно в Windows стало адовой мигренью и выглядело как попытка скрестить морского ежа с подъёмным краном. В итоге реализовать таки получилось, но обо всём по порядку.

Усекновение Windows

Как решались задачи по пунктам:
  • для блокирования записи на диск применяем EWF с отображением данных в RAM

Расширенный фильтр записи — драйвер, перехватывающий обращения на запись к жёсткому диску и буферизующий их в зависимости от настроек:
  • на специально выделенном скрытом разделе
  • в оперативной памяти

Реальной записи на защищённый раздел при этом не происходит, она выполняется только по запросу пользователя (т.н. commit), для чего добрейший Microsoft предоставляет API и готовую утилиту ewfmgr. При использовании специального раздела для буферизации данные будут сохранены между перезагрузками, в случае буферизации в RAM — нет.

  • создаём учётную запись из предустановленного шаблона Windows — «обычный пользователь» и ставим её в автологон
  • создаём компонент типа Shell (системная оболочка) запускающий АРМ в качестве системной оболочки; исключаем из системы explorer.exe. У особо хитроумного пользователя всё ещё есть возможность просматривать структуру каталогов через диалог сохранения файла в одном из окон АРМ, но:
    • это проблема программистов (хе-хе)
    • не забываем про фильтрацию записи и ограниченную учётную запись

  • т.к. я не большой любитель WHS-ного диалекта VB, то воспользовался батником, дёргающим netsh.exe firewall
  • с лишними компонентами поступил просто — создал проект XP Embedded, содержащий только жизненно необходимые компоненты (т.е. — автоматически добавленные по зависимостям аппаратного обеспечения компоненты + требуемая инфраструктура для работы АРМ)
  • отключение внешних USB-накопителей было выполнено варварским методом, а именно — из образа системы были исключены драйвер для USB-накопителей и мастер установки нового оборудования, а также через ключ реестра отключено отображение мастера нового оборудования при подключении неизвестного PnP-устройства (ну а вдруг)

    Проблема отключения PnP-устройств может быть решена несколькими способами (а ещё есть devcon), но этот меня привлёк своей глобальностью, т.е. заодно с USB-накопителями будут отключены любые другие несанкционированные периферийные устройства, но, при этом сохранится возможность заменить USB-мышь\клавиатуру (т.к. драйвер имеется в системе и он содержит цифровую подпись — такие драйвера устанавливаются автоматически)


Монтирование образов

Поиски ПО для монтирования образов в Windows были долгими и мучительными. Попадались только реализации RAM-drive, что безусловно классно, но не то. Вспомнил, что в комплект Windows Virtual Server включена утилита для монтирования файлов vhd, но как добавить её в мою WinXP и легально ли это вообще, мне так и не открылось. Проект века уже почти накрылся медным тазом, я прикидывал как бы отделаться меньшей кровью и избежать разработки собственного драйвера, как вдруг в гугле всплыла ссылка на отличнейший filedisk. Подходит по всем статьям — может монтировать образы как логические диски (эмулировать носитель он не умеет, но это и не требовалось), выполнен в виде драйвера, что позволяет легко добавить в проект XP Embedded, из коробки содержит консольную утилиту для управления дисками — то что надо для использования в стартовых скриптах. В общем — стопроцентное попадание.

Драйвер установлен, но где же взять сами образы? Берём dd for windows и создаём из её виртуального /dev/null образы требуемого размера. Подключаем их с помощью filedisk, видим логические диски без ФС, создаём на них NTFS, заполняем содержимым.

На одном из образов я разместил стартовые скрипты, которые запускаются после логона и производят некоторые настройки(установка IP-адреса, разрешения экрана и т.п. из конфиг-файла). Ясно, что к моменту логона, образы уже должны быть примонтированы. И тут я перепробовал кучу вариантов — Schtasks, который позволяет выполнять задачу при логоне (но он срабатывал как-то далеко не всегда), загонял скрипт монтирующий диски в сервисы с помощью sc — при этом, содержимое образов было недоступно пользовательским аккаунтам от имени которых запускалось прикладное ПО (как вариант можно было бы перенести задачи из скриптов в службу, но скриптоложство мне почему-то милее этого бездушного C++). В итоге сколхозил — AutoExNt выполняет монтирование перед логоном, а задачи конфигурирования системы исполняются с помощью зашифрованных cpau-заданий от имени администратора (т.к. автологон происходит под аккаунтом обычного пользователя). Это был первый из стабильно работающих вариантов, а отладка к тому моменту так меня достала, что плюнул на уродство способа и оставил как есть.

Дополнительно, разработал небольшую простую утилитку автозапуска, т.к. из проекта был исключён Explorer Shell и ключи авторана в реестре никто не обрабатывал, а программы на старте запускать кому-то надо было.

На этом мои мучения с системным ПО Windows в принципе окончились, настало время подумать как же вся эта хрень будет устанавливаться на целевую машину.


Развёртывание


Windows XP Embedded не содержит в себе инструментов для разметки и форматирования диска, в отличие от обычной Windows XP. Т.е. установка XPe заключается в копировании структуры каталогов проекта в корень раздела, отформатированного в FAT32/NTFS и помеченного как активный (флаг boot установлен). Комплект поставки XPe включает в себя диск WinPE, который содержит необходимые для разметки утилиты, но сценарии применения этого диска довольно туманны(например, он не может быть использован как диск восстановления). Похвалив про себя такую заботу о пользователях, я решил вообще не связываться с продукцией Microsoft для развёртывания XPe (хотя есть вроде бы бесплатный Windows AIK, но по предыдущему опыту попыток разобраться в лицензионных ограничениях продуктов Microsoft было принято решение поискать чего-то на стороне).

Решил попытать счастья с GNU/Linux, т.к. драйвер ntfs-3g уже довольно давно был стабильным и вполне себе работал (и, кстати, в довольно странных местах — по блажи Realtek, в SDK для их мультимедиа-платформ используется как ФС по умолчанию для внешних накопителей). Взял Live-CD Ubuntu LTS, очистил его от логотипов и упоминания Ubuntu (ибо для глубокой модификации системы Canonical выдвигает такие требования) и начал кастомизировать. Выбор дистрибутива был обусловлен личными предпочтениями.

Первая версия среды развёртывания представляла из себя bash-скрипт, который общался с пользователем с помощью zenity. Простенько и со вкусом. Была забракована, как недостаточно божественная в плане UI.

Вторая версия была написана на Mono (C# — корпоративный стандарт) и содержала в себе чуть ли не все графические элементы GTK. Высокая комиссия отметила, что UI по-прежнему недостаточно божественен, но таки жизнеспособен.

Сама процедура установки состояла из вызова внешних утилит — parted для разметки, mkfs.ntfs из пакета ntfsprogs(ntfstools) для создания ФС и rsync для копирования данных с установочного носителя.

Дальше — ребут и переход непосредственно к развёртыванию Windows Embedded.

Заключение


Сейчас Windows XP Embedded (Windows Embedded Standard 2009) стремительно теряет актуальность (хотя поддержка будет продолжаться до 2015 года) — на смену ей пришла Windows Embedded 7, которая гораздо, гораздо, гораздо удобнее XPe, однако разработкой с её использованием занимается мой коллега, я же описал (как мог, хе-хе) собственный опыт. Надеюсь кто-то найдёт что-нибудь полезное в этом сборнике вредных советов.

В завершении приведу список полезных ресурсов по Windows Embedded:

  • В первую очередь это конечно же тематический раздел на MSDN
  • Русскоязычный форум компании «Кварта» — официального поставщика Windows Embedded в России. Вероятно, единственный крупный русскоязычный ресурс по Windows Embedded.
  • Был ещё отличный репозиторий пользовательских скриптов и компонентов xpefiles.com, но с ним случилось что-то нехорошее.
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 28
  • +2
    Насчёт развёртывания: а imageX не пробовали? Ну и зря WAIK вы отбросили так сразу.
    • 0
      К тому времени, как коллега, работающий с Win Embedded 7 рассказал мне об этой прекраснейшей утилите, filedisk уже был успешно внедрён и менять его смысла особого не было.

      А с WAIK я откровенно психанул, т.к. немного ранее пытался разобраться с лицензированием Windows Embedded Server и поимел мощнейший геморрой (по лицензированию продуктов Майкростофт имхо диссер писать можно), поэтому связываться с продукцией Майкросфот лишний раз не хотелось :)

      И, как оказалось, не так много я потерял, отказавшись от WAIK. Там какие-то проблемы лицензионного характера были со включением в PE-диск .NET Framework (соответственно, никаких С# и PowerShell, утилита для развёртывания Win7 была написана на Qt), а т.к. я не пользовался imagex и образы дисков прекрасно обрабатывались mount, то профита от WAIK именно в моём случае не так много было.
    • +3
      // зануда
      хабрамен и хабравимен
      // зануда
      • 0
        Слушаю и повинуюсь!
        • +1
          // зануда^2
          Вы как говорите: посты или постс? топики или топикс? треды или тредс? месаги или мессаджес? В современном русском языке моден не чистый транслит, а обвешивание русским словообразованием и словоизменением калек с английского. Следите за модой.
          // зануда^2
          • +9
            Я чувствую твою боль, бро! Ни хрена, правда, не понял, но за душу взяло.
        • 0
          В ржд вроде от Symantec давно отказались. Полгода назад был Касперский)
          • 0
            Когда я последний раз посещал ростовский ДДЦ там был не только Касперский, а даже целый зоопарк, три или четыре разных на выбор. А вот где-то восточнее, за Уралом, встречал и работающий Symantec, правда это было года 3-4 назад. Но доступ в интранет РЖД с АРМ'ов для обновления av-баз у нас есть далеко не всегда, а без обновлений даже современный антивирус не долго бы протянул думается мне
            • 0
              Жесть конечно. Пензенский ИВЦ адово дрючил по поводу переустановки антивирусов.

              Вообще, насколько я знаю, Симантик был до 2010, потом был тренднет, а с 2011 касперский, который сам как вирус, потому что и без того полудохлые компьютеры в РЦСе еле ворочали его. Лучше всего было на телеграфе, где АРМы DOS-only.
          • –3
            По-моему, у нас появился новый Mithgol
            • +1
              Если вы о квазивосточном орнаменте вступления, то увы (а увы ли? :) ) — не страсть Мицгола к клинописи была причиной. Это дань памяти замечательного писателя — Леонида Соловьёва. При чём тут он спросите вы? А просто настроение такое было :)
            • 0
              А заблокирован ли вызов диспетчера задач через Ctrl + Shift+ Esc / Ctrl + Alt + Del? Вызов Utility manager через Win + U? (хехе, в каких-то версиях Win2000, а может и XP он запускался с правами System, что позволяло, залогинившись под самым бесправным пользователем, запустить cmd.exe с правами SYSTEM — а что возьмешь с безмозглых индусов из майкрософт). Заблокирован ли вызов sysdm.cpl через Win + Break/Pause?

              А в процессе загрузки нельзя ли нажать какой-нибудь F8 и загрузиться в командную строку?

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

              И правда, я крайне скептически отношусь к заявлениям типа «особо пуленепробиваемый Windows». Вы это хакерам из андерграундных кругов расскажите.
              • 0
                А диспетчера задач как бы нет. Ну, физически, нет исполняемого файла. Как и utility manager. И все изменения в ФС, даже если вдруг что-то и пойдёт не так будут сброшены при перезагрузке. И безопасного режим нет, как и прочих опций загрузки.

                Андеграундные хакеры… Ну даже и не знаю. У вас есть знакомые мегахацкоры среди электромехаников? Я принимаю вызов)
                • 0
                  Часть из этого функционала можно просто не включать в образ (например за F8 отвечает определённый компонент, вся контрольная панель по умолчанию не включается и т.д.), а если уж включили, тут надо использовать «классические» навыки администратора, чтобы закрутить гайки. Самое простое — автоматически накатить локальную политику в процессе развёртывания системы, если мало или не удобно — скрпиты или собствыенные утилиты.
                • 0
                  Не совсем в тему, но тоже про РЖД и компьютеры.
                  Был у нас один клиент, который внедрял наш софт в вагонах-ресторанах поездов. Всё бы ничего, да в некоторых поездах требовалась сеть, т.к. кроме ресторана были пункты продажи еды в купе проводников, которые тоже требовалось автоматизировать. Построение сети в поезде оказалось для клиента нетривиальной задачей: первая сеть на витой паре проработала до первой расцепки вагонов. Вторая (с размыкаемыми сегментами) работала дольше, однако в местах соединений из-за вибрации и пыли очень быстро портился контакт, и сетка начинала глючить. Ну и рассоединить/соединить частенько забывали.
                  Третьей попыткой была беспроводная сеть, которая работала работала не всегда и не везде: точка доступа не могла охватить весь состав.
                  Давно с тем клиентом не общался, последний раз он планировал ставить несколько точек, соединенных мостом. Но для устойчивой связи по его расчетам требовалось поставить точки чуть не в каждый вагон, а такой длинный мост сами понимаете здорово увеличивает пинги.

                  PS: Кстати на POS-терминалах в тех поездах тоже стоял XP Embedded.
                  • 0
                    на что-то более прочное и надёжное, но при этом win32-совместимое.

                    ИМХО, так себе встраиваемая, раз x86.
                    В свое время пытался поставить винду на железку под SuperH4 платформу, беглый поиск в инете показал что на ней пойдет только Windows Embedded CE (не windows embedded и не windows ce, а некий ещё более урезанный вариант). Но остановился где-то в процессе поиска какой же загурзчик нужен системе, откуда его добыть и как сформировать образ для записи на nand. Почему-то все инструкции, которые я находил, заключались в совете подключить cd-rom к устройству, на который буду ставить windows. Вероятно, я плохо искал информацию. Точно известно, что у меня совершенно нет навыков в работе с встраиваемым windows, но в итоге, через пару дней ковыряния триальной студии, я просто забил на это.
                    • 0
                      Windows Embedded CE — это тот же Windows CE, Майкрософт решила привести названия своих встраиваемых систем к одному виду (Windows Embedded CE, Standard, Server).

                      Насчёт того, что не встраиваемая — ну давайте посмотрим :) Вот, например, смартфон . Мы делали информационные дисплеи для диспетчеров на горке. Такая брутальная панель в стальном корпусе с экранчиком на 15", а внутре у ней — x86-промышленник под управлением XPe.
                      • +2
                        ок. встраивать можно что угодно. Чем windows embedded отличается от десктопного? Тем, что в стандартной поставке идут несколько дополнительных программ? Или тем, что в нем наоборот не идут стандартные десктопные программы?
                        Монтировать в папки разные диски вроде и ntfs на десктопе позволяет? Всяческие огранчиения, типа запрета запуска программ или доступа к ФС позволяют делать локальные и групповые политики в любой версии windows.
                        • 0
                          Если это Windows Embedded Standard — тем, что он поставляется в виде набора компонентов, из которых при создании рабочего образа можно выбрать только те, которые необходимы. Например, можно сделать сборку, вообще без поддержки оболочки Explorer, без подержки сети, USB, без Task Manager, Internet Explorer и т.д. При этом минимальный рабочий образ, практически со всеми Win32 API и специальным менеджером сессий Minlogon (вместо Winlogon) можно уместить в 24-39 Мб. Плюс возможность загрузки с разнообразных носителей, включая USB, CD-ROM, плюс поддержка разнообразных дополнительных программных возможностей.

                          Если речь идет о Windows Embedded Compact/CE — это систма с поддержкой реального времени и архитектурой, отличной от обычной «настольной» Windows. Также поставляется в виде компонентов, с исходными кодами и работает на x86, ARM, MIPS (в предыдущих версиях ещё был SHx и совсем давно PowerPC)
                          • 0
                            Да, встроить дейсвтительно можно практически всё, что угодно. Вопрос в затраченном времени. Встроить WES2009, если у вас уже есть решения под WinXP и вы хотите его «встроить», можно очень и очень быстро.

                            Также как и найти разработчика и удобный инструментарий под WinXP проще, поэтому, если в принципе она подходит, использовать её удобно и просто.
                            • 0
                              //offtop
                              status, огромное вам спасибо за книгу по XPe! :)
                              Без нее по первому времени очень тяжко было.
                              • 0
                                *stasus

                                Прошу прощения, у клавиатуры Андроида на некоторые вещи собственный взгляд.
                            • 0
                              Отличается наличием IDE для глубокой модификации дистрибутива, поддержкой фильтров записи (EWF и
                              FBWF), поддержкой загрузки с компакт-диска/USB-flash из коробки. А т.к. кастомная версия Windows наверняка будет весить меньше, то XPe лучше подходит для сетевой загрузки. Но вообще принципиальных отличий конечно же нет, учитывая то, кто на базе кого построен)
                        • +1
                          Я вот как раз сегодня на эту «классную» систему часа два принтер устанавливал. То этого нет, то вот это дай, kernel32.dll отсутствует…
                          В итоге поставил рядом ноут с XP Prof и флешкой тягал запрашиваемые dll…
                          • 0
                            Она для такого не предназначена. Эту опцию должен предусматривать производитель устройства — это можно сделать в определённых случаях.

                            Вы своими действиями нарушили правила использования устройства и лицензию на использование операционной системы в его составе и лицензию на использование операционной системы в составе ноутбука. Если даже отвлечся от потери гарантии на устройство, после ваших действий устройстово стало содержать нелицинзионную весрию ОС. Уж не знаю, насколько это критично в вашем случае.
                          • 0
                            Попробуйте добавить вот этот макрокомпонент и разрешить зависимости. Конечно, это не «серебрянная пуля», но мне помогло установить USB-принтер.

                            Сам драйвер ставил через printui.dll
                            • 0
                              Ruma7a, спасибо, враг уже побежден.
                              Понадобились unires.dll, Unidrv.dll и Unidrvui.dll

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.