Перевод статьи из блога Джейсона Гина "Разорви на части"
TL;DR: да, на осциллографе Keysight 1000 X-Series реально можно запустить Doom! Однако это непросто сделать.
Keysight DSOX1102G
Осциллограф должен иметь в своём арсенале любой уважающий себя энтузиаст-электронщик. Осциллографы, кратко говоря, позволяют вам изучать волны электрических сигналов в контуре, а цифровые осциллографы (digital storage oscilloscope, DSO) незаменимы тем, что могут найти редкие ошибки в сигнале, которые не распознает аналоговый осциллограф или мультиметр.
Тема моей статьи — DSOX1102G от компании Keysight Technologies (бывш. Agilent), из их недорогой линейки осциллографов, отличающихся неплохим соотношением цены к качеству по сравнению с продукцией конкурентов. Как и большинство их осциллографов, на этой модели работает встроенная ОС Windows Embedded CE 6.0 (также известная, как Windows CE или WinCE), но, как и в большинстве случаев применения WinCE, её интерфейс вы практически никогда не видите – он спрятан за специально сделанным интерфейсом для пользователя.
Этап 1: пробуждение
Когда в начале 2017 была запущена серия Keysight 1000-X, один из обзорщиков с Hackaday заметил, что способ сохранения данных на этих осциллографах иногда приводил к их падению и перезагрузке, и отметил, что перед загрузкой на экране на несколько секунд можно было увидеть указатель мыши. В его посте была гифка, где он сохраняет файл, вызывающий падение, и я заметил нечто странное на одном из кадров анимации – там можно было различить панель задач Windows сразу перед чёрным экраном с ошибкой. Интересненько!..
Выиграв свой осциллограф благодаря конкурсу Scope Month от Keysight, пару месяцев я не думал об этом, пока не наткнулся на экран с отказом самостоятельно. В моём случае я обнаружил, что заголовок Windows CE был виден поверх обработчика отказов осциллографа; перетаскивание заголовка оставляло за собой след, и в итоге подвешивало WinCE. Такое случалось очень редко, поэтому, наткнувшись на отказы впоследствии, я просто позволил обработчику просканировать файловую систему и перезагрузить ОС.
Однако меня это заинтриговало, и я хотел узнать большое о том, что происходит с лежащей в основе системы WinCE. Я обнаружил, что USB-порт осциллографа довольно чувствителен к ошибкам, и простое шатание флэшки в порту может привести к аварийному сбою. Однако этого было недостаточно для сбора нужного количества информации, поскольку это был ненадёжный метод.
Так начались мои поиски доступа к рабочему столу WinCE.
Сначала я попробовал чисто программное решение, пытаясь создать файл обновления прошивки .ksx (на самом деле это просто архив .cab), который бы смог завершить работу программы осциллографа и открыть Проводник Windows – не получилось. ПО осциллографа выдавало сообщение об ошибке, жалуясь на невозможность открыть файл. Оказывается, такое решение не сработало бы, даже если бы я заставил его загрузить файл обновления, поскольку ПО осциллографа не выходит на рабочий стол во время обновления. Встретив это первое серьёзное препятствие, я на время отставил в сторону любопытство и пользовался осциллографом по прямому назначению.
Этап 2: заглянем поглубже
Из-за своего любопытства однажды я решил посмотреть, сможет ли осциллограф считывать и записывать дискеты на 3,5" (или, как говорит молодёжь, распечатанную иконку сохранения) через USB-порт – и он смог! Однако я заметил одну странную проблему; осциллограф аварийно завершал работу, если я оставлял дисковод в USB-порту при включении. Эврика! Я нашёл способ надёжно вызывать аварийный отказ.
Тут, к несчастью, меня поджидало второе серьёзное препятствие. Этот отказ при загрузке происходил, только если в USB-порт было включено единственное устройство — дисковод. Отказа не было, если я использовал USB-хаб, в который включал дисковод. Это означало, что мне придётся очень быстро переключаться между дисководом и USB мышью с клавиатурой. Спешка с целью как можно быстрее вынуть дисковод и воткнуть комбинацию из клавиатуры и тачпада в USB в процессе загрузки была утомительной и раздражающей. Мне нужно было решение получше – железячное решение.
Специальный переключатель A/B для USB, сделанный мною для быстрой замены устройств
Использовав старый USB-кабель, дохлый USB-хаб и DPDT-переключатель, я создал переключатель USB A/B, чтобы упростить и ускорить процесс переключения между устройствами. При помощи этого метода мне удалось попытаться установить контакт с ОС WinCE на долю секунды, пока панель задач была видимой на экране, и до тех пор, пока обработчик отказов не сломал мне всю малину. При помощи магии, заключённой в замедленной съёмке моего Samsung Galaxy S9, я смог определить, что могу отправлять последовательности нажатий клавиш в WinCE и она их обрабатывает – даже на заставке системы! Я смог получить информацию о системе, вслепую нажимая клавиши, и потом изучая отклик при аварийном отказе ПО осциллографа. Тут я столкнулся со вторым препятствием.
Возможность очень краткого взаимодействия с WinCE – это хорошо, но она была бесполезной, поскольку я не мог взять над ней управление до тех пор, пока обработчик отказов перезагрузит систему. Обработчик крепко держался за ОС, и никакая долбёжка по клавиатуре и Ctrl+Alt+Delete не пускали меня обратно в WinCE.
Этап 3: ищем точку опоры
И снова моё периодически играющее любопытство пригодилось, когда я решил использовать свой старый Sony Clie PEG-NX73V (наладонник на PalmOS от 2003 года) в качестве USB-привода. У него была функция импорта данных, позволявшая перетаскивать файлы на карту памяти точно так же, как на съёмный диск.
Точно так же, как и в случае с USB-дисководом, произошёл отказ системы, когда я включил осциллограф, не вытащив PDA. Однако на этот раз обработчик отказов решил, что файловая система PDA – это повреждённый раздел прошивки, и предложил загрузить обновление прошивки с внешней USB-флэшки.
Это поведение не было регулярным, иногда ПО осциллографа всё равно загружалось, и появлялось очень странное окно из WinCE с ярко-голубым указателем мыши, оставлявшим следы на экране. Однако в этом странном состоянии мне удалось оттащить окно ПО осциллографа InfiniiVision в сторону, и я попытался потыкаться с ОС. Но ПО осциллографа вело себя очень агрессивно и возвращало себе фокус каждый раз после клика вне окна. После некоторой возни со странно раскрашенной ОС я смог обойти её. Я не мог просмотреть файловую систему, поскольку не получалось надолго забирать управление от окна ПО осциллографа, но я смог вызвать диалоговое окно свойств системы, где было написано, что осциллограф основан на Windows CE 6.00, и у него есть 100 Мб RAM.
Затем я решил порыться на форумах EEVblog, где люди активно пытаются хакнуть осциллограф, чтобы открыть дополнительные возможности. Там я обнаружил, что ПО ищет файл infiniiVisionStartupOverride.txt в корне USB-флэшки, и если находит, то пытается загрузить с неё ПО осциллографа. И хотя, судя по всему, на самом деле прошивка не загружала ПО с флэшки, этот процесс прервал запуск ПО осциллографа, и тогда уже никто не забирал у меня управление ОС. С этого момента всё стало интереснее – обработчик отказов открывал окно Проводника, и введя в поле для имени файла "*.*", я смог начать рыться в файловой системе осциллографа и USB-флэшки! Именно это мне и было нужно для получения контроля над WinCE. Однако, я встретил очередное препятствие: осциллограф перезагружался через 60 секунд, из-за чего у меня не было много времени на рытьё в операционной системе.
Запрос на обновление прошивки DSOX1102G с диалогом выбора файла с флэшки
Менеджер задач Windows CE показывает запущенные процессы на экране восстановления прошивки
Скопировав несколько инструментов Windows CE, например, Windows CE Task Manager, я заметил два интересных процесса, которые были запущены, когда обработчик отказов ещё был виден — recoverInfiniiVision.exe и processStartupFolder.exe; судя по всему, первый был обработчиком отказов, не дававший мне доступ к WinCE после аварийного отказа ПО осциллографа. Прибив второй процесс при помощи iTaskMgr (бесплатная версия менеджера задач WinCE не даёт убивать процессы) я смог удержать осциллограф от перезагрузок, а прибив первый, я увидел чистый рабочий стол WinCE – и вот я внутри! К несчастью, мне не удалось восстановить панель задач, из-за чего ориентироваться в ОС было довольно неудобно.
Я создал на рабочем столе новую папку, чтобы открыть Проводник, и, наконец, смог заняться изучением файловой системы осциллографа. Этому очень помогла программа Total Commander/CE, имеющая встроенный текстовый редактор, которого не было в данной версии WinCE.
Копаясь в файловой системе при помощи Total Commander/CE (пока никакой панели задач)
Этап 4: полный контроль
Теперь, сумев добраться до небесно-голубого рабочего стола, для полноценного ощущения WinCE я должен был восстановить панель задач. Погуглив, полазав по Stack Overflow, я накидал небольшую программу для этого. Открыв её из Проводника, я получил полную версию рабочего стола WinCE! Наконец у меня был полный контроль над базовой ОС!
Свобода – полноценный рабочий стол WinCE на осциллографе!
С этого момента я начал рыться в файловой системе и смотреть, какие интересные инструменты там можно найти. Интерпретатор командной строки не хотел запускаться, однако я покопался в реестре и нашёл ключ HKEY_LOCAL_MACHINEDriversConsoleOutputTo, значение которого было 0xFFFFFFFF. Поменяв его на 0, я сумел сделать Command Prompt видимым на рабочем столе, поэтому я сделал ещё одну небольшую программу, которая занималась именно этим.
Всё шло хорошо, я сделал командный файл со всеми командами, необходимыми для того, чтобы убивать ПО осциллографа, обработчик стартовой папки, обработчик отказов, восстанавливать панель задач и разрешать запуск Command Prompt. Однако для открытия меню обработчика отказов требовался мой PDA, а это означало, что другие не смогут воспроизвести такой эффект.
Покопавшись дальше, я обнаружил, что как только появлялась заставка и начинали мигать светодиоды на панели, WinCE начинала обрабатывать нажатия клавиш даже без устройства, ронявшего ПО. Нажатие win+U подвешивало осциллограф, поскольку этим я открывал меню Пуск и выбирал опцию Suspend (и у ОС не было возможности вернуть после этого контроль, поскольку у осциллографа была только кнопка выключения питания). Помня это, я переименовал свой файл в a.bat, чтобы его имя было проще набирать, и попытался запускать его при загрузке через win+R, команду usba.bat и нажатия Enter. Но осциллограф в результате просто показывал заставку на экране, хотя в фоне WinCE была жива, и я просто не мог видеть, что там происходит. Оказывается, что обработчик отказов был необходимым компонентом для демонстрации рабочего стола ОС, и мне нужно было просто добавить в командный файл несколько строчек для запуска и последующей остановки обработчика отказов. Добавив эти последние штрихи, я смог (полуавтоматически) загружать осциллограф прямо до появления рабочего стола, используя только USB-флэшку, мышь и клавиатуру!
Этап 4: Да, на нём запускается DOOM!
Получив доступ к WinCE, я смог, наконец, ответить на вопрос: «Запускается ли на нём Doom?» И, как оказалось, реально запускается! После запуска осциллографа на это ушло полтора года, но до этой вехи я, наконец, дошёл.
Это не обман: на осциллографе Keysight 1000 X можно запустить Doom!
Doom II работает на моём осциллографе DSOX1102G! (3 кадра в секунду)
Запуск Doom в окошке размером 320×240 позволило выжать достаточно кадров в секунду для игры. Посмотрите, какая палитра цветов!
В следующей статье я ещё немного поиграюсь с этой легендарной видеоигрой на железяке, которая никогда не предназначалась для игр.
Doom в действии в разрешении 320×240, 256 цветов! На осциллографе!
Файлы для скачивания
Я выложил файлы, которые могут вам понадобиться для того, чтобы попробовать то же самое на своём осциллографе – но учтите, я не отвечаю за его превращение в кирпич или что-то ещё неприятное! Я проверял всё это только на своём DSOX1102G, но подозреваю, что другие модели серии 1000 X и другие осциллографы от Keysight, обладающие функцией восстановления прошивки, тоже могут сработать. Прошивка осциллографа сделана так, что вся WinCE запускается в оперативной памяти и не сохраняется после перезагрузки, поэтому все изменения в ОС, ломающие систему, не превратят осциллограф в кирпич (файлы с прошивкой лежат в директориях NAND-флэшки, которые нельзя открыть через Проводник, а можно лишь набрать по имени).
Флэшку необходимо будет отформатировать в FAT или FAT32, и распаковать в её корень zip-архив Scope Liberator. Инструкции содержатся в readme.txt.
Если вам интересен исходный код вспомогательных программ, которые возвращают панель задач и интерпретатор командной строки, я их тоже выложил.
Автор: SLY_G